書生浦語第五期-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
英文地址,請注明出處:http://en.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應用、移動應用或數據分析場景中,數據庫常常需要處理百萬甚至千萬級的數據記錄。一次性加載所有數據不僅效率低下,還會消耗大量網絡帶寬和內存資源。數據庫分頁技術正是解決這一挑戰的關鍵…