論文分類打榜賽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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84767.shtml
英文地址,請注明出處:http://en.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;使用循環復制原…