书生浦语第五期-L1G4-InternLM 论文分类微调实践(XTuner 版)

XTuner介绍

一句话介绍XTuner:

XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。

核心特点:

  1. 高效:支持在有限资源下微调大模型,如在8GB显存上微调7B参数模型,也支持多节点微调70B+模型;自动分发高性能算子加速训练;兼容DeepSpeed优化策略。

  2. 灵活:支持多种大语言模型(如InternLM、Llama、ChatGLM等)和多模态模型;支持多种数据格式;支持QLoRA、LoRA、全量参数微调等多种微调算法。

  3. 全能:支持增量预训练、指令微调与Agent微调;预定义多种对话模板;训练所得模型可无缝接入部署工具LMDeploy和评测工具OpenCompass。

解决问题:

  • 解决大模型微调的资源门槛高、效率低的问题

  • 解决多种模型架构和微调方法的兼容性问题

  • 解决从训练到部署的工作流程不连贯问题

适用场景:

  • 在计算资源有限的情况下微调大语言模型

  • 多模态模型(如LLaVA)的预训练与微调

  • 领域特定模型的定制化训练

  • 大模型的Agent能力训练

价值:

XTuner降低了大模型微调的技术和资源门槛,使研究人员和开发者能够高效地将通用大模型适配到特定领域或任务,同时保持高性能,并提供从训练到部署的完整解决方案。

  • 安装依赖
conda activate /root/share/pre_envs/pytorch2.3.1cu12.1
pip install 'xtuner[deepspeed]' timm==1.0.9  
pip install transformers==4.48.0
pip install modelscope

检测环境是否安装好:

xtuner list-cfg

  • 微调模型

实现代码:

# Copyright (c) OpenMMLab. All rights reserved.
# —— 动态补丁:兼容 transformers>=4.48 ——
from transformers.cache_utils import DynamicCache     # 1. 引入类
if not hasattr(DynamicCache, "get_max_length"):       # 2. 判断是否缺失DynamicCache.get_max_length = DynamicCache.get_max_cache_shape  # 3. 补一个别名
import torch
from datasets import load_dataset
from mmengine.dataset import DefaultSampler
from mmengine.hooks import (CheckpointHook,DistSamplerSeedHook,IterTimerHook,LoggerHook,ParamSchedulerHook,
)
from mmengine.optim import AmpOptimWrapper, CosineAnnealingLR, LinearLR
from peft import LoraConfig
from torch.optim import AdamW
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfigfrom xtuner.dataset import process_hf_dataset
from xtuner.dataset.collate_fns import default_collate_fn
from xtuner.dataset.map_fns import alpaca_map_fn, template_map_fn_factory
from xtuner.engine.hooks import (DatasetInfoHook,EvaluateChatHook,VarlenAttnArgsToMessageHubHook,
)
from xtuner.engine.runner import TrainLoop
from xtuner.model import SupervisedFinetune
from xtuner.parallel.sequence import SequenceParallelSampler
from xtuner.utils import PROMPT_TEMPLATE, SYSTEM_TEMPLATE#######################################################################
#                          PART 1  Settings                           #
#######################################################################
# Model
pretrained_model_name_or_path = "./internlm2_5-7b-chat"
use_varlen_attn = False# Data
alpaca_en_path = "/root/user/FinetuningPaper/sftdata.jsonl"#换成自己的数据路径
prompt_template = PROMPT_TEMPLATE.internlm2_chat
max_length = 1024
pack_to_max_length = True# parallel
sequence_parallel_size = 1# Scheduler & Optimizer
batch_size = 1  # per_device
accumulative_counts = 1
accumulative_counts *= sequence_parallel_size
dataloader_num_workers = 0
max_epochs = 1
optim_type = AdamW
lr = 2e-4
betas = (0.9, 0.999)
weight_decay = 0
max_norm = 1  # grad clip
warmup_ratio = 0.03# Save
save_steps = 50
save_total_limit = 2  # Maximum checkpoints to keep (-1 means unlimited)# Evaluate the generation performance during the training
evaluation_freq = 50
SYSTEM = SYSTEM_TEMPLATE.alpaca
evaluation_inputs = ["请给我介绍五个上海的景点", "Please tell me five scenic spots in Shanghai"]#######################################################################
#                      PART 2  Model & Tokenizer                      #
#######################################################################
tokenizer = dict(type=AutoTokenizer.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,padding_side="right",
)model = dict(type=SupervisedFinetune,use_varlen_attn=use_varlen_attn,llm=dict(type=AutoModelForCausalLM.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,torch_dtype=torch.float16,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",),),lora=dict(type=LoraConfig,r=64,lora_alpha=16,lora_dropout=0.1,bias="none",task_type="CAUSAL_LM",),
)#######################################################################
#                      PART 3  Dataset & Dataloader                   #
#######################################################################
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,
)sampler = SequenceParallelSampler if sequence_parallel_size > 1 else DefaultSampler
train_dataloader = dict(batch_size=batch_size,num_workers=dataloader_num_workers,dataset=alpaca_en,sampler=dict(type=sampler, shuffle=True),collate_fn=dict(type=default_collate_fn, use_varlen_attn=use_varlen_attn),
)#######################################################################
#                    PART 4  Scheduler & Optimizer                    #
#######################################################################
# optimizer
optim_wrapper = dict(type=AmpOptimWrapper,optimizer=dict(type=optim_type, lr=lr, betas=betas, weight_decay=weight_decay),clip_grad=dict(max_norm=max_norm, error_if_nonfinite=False),accumulative_counts=accumulative_counts,loss_scale="dynamic",dtype="float16",
)# learning policy
# More information: https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md  # noqa: E501
param_scheduler = [dict(type=LinearLR,start_factor=1e-5,by_epoch=True,begin=0,end=warmup_ratio * max_epochs,convert_to_iter_based=True,),dict(type=CosineAnnealingLR,eta_min=0.0,by_epoch=True,begin=warmup_ratio * max_epochs,end=max_epochs,convert_to_iter_based=True,),
]# train, val, test setting
train_cfg = dict(type=TrainLoop, max_epochs=max_epochs)#######################################################################
#                           PART 5  Runtime                           #
#######################################################################
# Log the dialogue periodically during the training process, optional
custom_hooks = [dict(type=DatasetInfoHook, tokenizer=tokenizer),dict(type=EvaluateChatHook,tokenizer=tokenizer,every_n_iters=evaluation_freq,evaluation_inputs=evaluation_inputs,system=SYSTEM,prompt_template=prompt_template,),
]if use_varlen_attn:custom_hooks += [dict(type=VarlenAttnArgsToMessageHubHook)]# configure default hooks
default_hooks = dict(# record the time of every iteration.timer=dict(type=IterTimerHook),# print log every 10 iterations.logger=dict(type=LoggerHook, log_metric_by_epoch=False, interval=10),# enable the parameter scheduler.param_scheduler=dict(type=ParamSchedulerHook),# save checkpoint per `save_steps`.checkpoint=dict(type=CheckpointHook,by_epoch=False,interval=save_steps,max_keep_ckpts=save_total_limit,),# set sampler seed in distributed evrionment.sampler_seed=dict(type=DistSamplerSeedHook),
)# configure environment
env_cfg = dict(# whether to enable cudnn benchmarkcudnn_benchmark=False,# set multi process parametersmp_cfg=dict(mp_start_method="fork", opencv_num_threads=0),# set distributed parametersdist_cfg=dict(backend="nccl"),
)# set visualizer
visualizer = None# set log level
log_level = "INFO"# load from which checkpoint
load_from = None# whether to resume training from the loaded checkpoint
resume = False# Defaults to use random seed and disable `deterministic`
randomness = dict(seed=None, deterministic=False)# set log processor
log_processor = dict(by_epoch=False)

pretrained_model_name_or_path alpaca_en_path 只需要注意34和38行模型、数据位置就好了。

微调指令:

xtuner train internlm2_5_chat_7b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero1

微调完成之后,需要进行两个步骤:首先将PTH格式的模型转换为HuggingFace格式,然后将adapter与基础模型合并。

  • 将PTH格式转换为HuggingFace格式

cd #你的项目根目录
export MKL_THREADING_LAYER=GNU 
xtuner convert pth_to_hf internlm2_5_chat_7b_qlora_alpaca_e3_copy.py ./work_dirs/internlm2_5_chat_7b_qlora_alpaca_e3_copy/iter_xx.pth ./work_dirs/hf

  • 合并adapter和基础模型

cd #你的项目根目录
export MKL_THREADING_LAYER=GNU 
xtuner convert merge ./internlm2_5-7b-chat ./work_dirs/hf ./work_dirs/merged --max-shard-size 2GB

之后检测微调之后模型和之前模型推理方面的不同:

之前:

之后:

  • 部署模型
pip install lmdeploy
python -m lmdeploy.pytorch.chat ./work_dirs/merged \--max_new_tokens 256 \--temperture 0.8 \--top_p 0.95 \--seed 0

  • 提交模型并评测

将微调好的模型上传模型至 ModelScope 模型库 ,有 ① swift 指令 ② ModeScope 官方 Python SDK 两种方法,二选一即可。

ModelScope官方PythonSDK上传模型:

pip install modelscope

使用Python SDK来上传模型

from modelscope.hub.api import HubApi
from modelscope.hub.constants import Licenses, ModelVisibility# 配置基本信息
YOUR_ACCESS_TOKEN = 'xxx(从modelscope获取,即上节的hub_token)'
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)# 取名字
owner_name = 'xxx'    # ModelScope 的用户名,需根据自己情况修改
model_name = 'xxx'    # 为模型库取个响亮优雅又好听的名字,需根据自己情况修改
model_id = f"{owner_name}/{model_name}"# 创建模型库,若已通过6.1节的ModelScope网页端创建,此段代码可忽略
api.create_model(model_id,visibility=ModelVisibility.PUBLIC,license=Licenses.APACHE_V2,chinese_name=f"{owner_name}的论文分类打榜赛模型")# 上传模型
api.upload_folder(repo_id=f"{owner_name}/{model_name}",folder_path='/root/path/to/your/model',    # 微调后模型的文件夹名称commit_message='upload model folder to repo',    # 写点开心的上传信息
)

将modelscope的hub_token和你存放模型的位置,放入代码

运行:

得分:

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

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

相关文章

从灵感枯竭到批量产出:无忧秘书创作平台如何重构内容生产者的工作流程?全环节赋能分析

在当今快节奏的数字时代,内容创作者面临着前所未有的挑战。无论是自媒体运营者、自由撰稿人还是企业营销人员,都需要高效地生产高质量的内容以满足市场需求。然而,灵感枯竭、效率低下以及内容质量不稳定等问题常常困扰着这些内容生产者。为了…

【开源工具】基于Python的PDF清晰度增强工具全解析(附完整源码)

📄✨ 【开源工具】基于Python的PDF清晰度增强工具全解析(附完整源码) 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,我们一起进…

Qwen-Image开源模型实战

Qwen-Image开源模型实战:ComfyUI低显存量化部署与中文海报生成指南 阿里云通义千问团队最新开源的Qwen-Image模型以其卓越的中英文文本渲染能力在AI绘图领域掀起了一场革命。这款200亿参数的MMDiT架构模型不仅能够生成高质量图像,更突破了AI绘图长期存在…

JavaWeb03——javascript基础语法

1.什么是JavaScript?JavaScript(简称 JS)是一种 编程语言,它主要用来为网页添加交互功能。它可以让网页变得动态,让它不仅仅是静态的文字和图片,还能响应用户操作(比如点击按钮、弹框警告等&…

数据库入门:从零开始构建你的第一个数据库

欢迎来到数据库的世界!今天,我们将一起探索如何创建、管理和查询数据库。无论你是初学者还是希望加深理解的开发者,这篇博客都将帮助你更好地掌握数据库的基础知识。一、数据库的基本操作创建数据库首先,让我们从创建一个新数据库…

从汇编角度揭秘C++构造函数(1)

C的构造函数一直比较神秘,今天我们通过汇编的角度来揭秘一下,它的本质是什么。与常规函数有什么不同。从以下这段代码说起: class Person { public:Person(int age) { _age age; }void printAge(){ printf("age %d\r\n",_age); …

java10学习笔记

Java 10 于 2018 年 3 月发布,是 Java 平台按照新的六个月发布周期发布的第一个版本。虽然相比 Java 8 和 Java 9 的大型更新,Java 10 的变化较小,但仍然引入了一些重要的特性,特别是本地变量类型推断(var)…

Flutter Listview的基本使用

Listview() 前端页面常见的一个以列表方式显示内容的组件。可垂直或水平滚动的列表。属性说明scrollDirection设置滚动的方向,取值包括horizontal、verticalreverse设置是否翻转,默认值falseitemExtent设置滚动方向子元素的长度,垂直方向为高…

强化学习笔记:从Q学习到GRPO

推荐学习huggingface的强化学习课程,全面了解强化学习的发展史。 以下是个人笔记,内容不一定完整,有些是个人理解。 基于值函数(value function)的强化学习 基于值函数(value function)的强化学习:学习的是一个值函数&#xff0…

MySQL索引底层原理与性能优化实践

#技术栈深潜计划一、前言 在日常开发中,MySQL数据库以其高效、易用、可扩展等特性成为最主流的关系型数据库之一。而索引作为数据库查询优化的核心工具,被誉为“数据库的加速器”。但你真的了解MySQL索引的底层原理吗?为什么InnoDB默认采用B树…

Ext系列文件系统

1.硬件常见的硬件有磁盘、服务器、机柜、机房机械磁盘但是计算机中唯一的一个机械设备磁盘外设的特点就是外设慢容量大,价格便宜1.1.磁盘的物理结构磁盘的物理图:磁盘的存储图扇区:是磁盘存储数据的基本单位,512字节,块设备磁盘的…

前缀函数——KMP的本质

前缀函数我个人觉得 oiwiki 上的学习顺序是很合理的,学 KMP 之前先了解前缀函数是非常便于理解的。前后缀定义 前缀 prefixprefixprefix 指的是从字符串 SSS 的首位到某个位置 iii 的一个子串,这样的子串写作 prefix(S,i)prefix(S,i)prefix(S,i)。 后缀 …

解决chrome下载crx文件被自动删除,加载未打包的扩展程序时提示“无法安装扩展程序,因为它使用了不受支持的清单版本解决方案”

解决chrome下载crx文件被自动删除 【chrome设置-隐私与安全-安全浏览】,选择 不保护 【chrome设置-下载内容】,勾选 下载前询问每个文件的保存位置 下载crx文件时,选择保存文件夹,将 .crx后缀 改为 .zip后缀,再确定。 …

嵌入式学习day23-shell命令

linux软件编程学习大纲:1.IO操作文件2.多任务编程3.网络编程4.数据库编程5.硬件设备管理学习目标:1.学习接口调用(第一层)2.软件操作流程和思想(第二层)3.软件设计思想和流程架构(第三层&#x…

GPT-5 系列深度详解:第1章-引言(目录)

1 引言2 模型数据与训练3 观察到的安全挑战与评估 3.1 从强制拒绝到安全完成 3.2 禁⽌内容 3.3 拍⻢屁 3.4 越狱 3.5 指令层级 3.6 幻觉 3.7 欺骗 3.7.1 欺骗思维链监控 3.8 图像输入 3.9 健康 3.10 多语言性能 3.1.1公平性与偏见: BBQ评估4 红队测试与外部评估…

NineData 新增支持 AWS ElastiCache 复制链路

2025 年,绝大多数企业已完成业务上云,以获取更高的弹性、可扩展性和成本效益。AWS ElastiCache 作为 AWS 提供的全托管式内存数据库服务,已成为许多企业在云上构建高并发、低延迟应用的理想选择。NineData 数据复制现已全面支持从自建 Redis …

人工智能-python-特征选择-皮尔逊相关系数

以下是关于特征选择中常用方法的表格总结,并且详细阐述了皮尔逊相关系数的原理、计算方法、步骤以及示例。 常用特征选择方法总结方法原理优点缺点使用场景过滤法(Filter Method)基于特征的统计信息(如相关性、方差等)…

LabVIEW多循环架构

​LabVIEW的多循环架构是一种常见的架构,本文Temperature Monitoring.vi 采用 LabVIEW 典型的多循环并行架构,通过功能模块化设计实现温度监测全流程,各循环独立运行又协同工作,构成完整的监测系统。1. 事件处理循环(E…

深入理解Maven BOM

一、什么是Maven BOM? 1.1 BOM的基本概念 Maven BOM(Bill of Materials,材料清单)是一种特殊的POM文件,它主要用于集中管理多个相关依赖的版本。BOM本身不包含任何实际代码,而是作为一个 版本管理的"参…

Mysql分页:高效处理海量数据的核心技术

Mysql分页:高效处理海量数据的核心技术01 引言 在Web应用、移动应用或数据分析场景中,数据库常常需要处理百万甚至千万级的数据记录。一次性加载所有数据不仅效率低下,还会消耗大量网络带宽和内存资源。数据库分页技术正是解决这一挑战的关键…