探索Qwen2ForCausalLM 架構上進行微調

簡述

試驗參考了mini_qwen 的開源實現

GitHub - qiufengqijun/mini_qwen: 這是一個從頭訓練大語言模型的項目,包括預訓練、微調和直接偏好優化,模型擁有1B參數,支持中英文。這是一個從頭訓練大語言模型的項目,包括預訓練、微調和直接偏好優化,模型擁有1B參數,支持中英文。. Contribute to qiufengqijun/mini_qwen development by creating an account on GitHub.https://github.com/qiufengqijun/mini_qwen

分詞器使用Qwen/Qwen2.5-0.5B-Instruct,通過擴充模型隱藏狀態層數、嵌入層維度和注意力頭數,增加參數量到1B,使用flash_attention_2進行加速

主要特點:

  • 低資源需求:預訓練和微調僅需 12GB 顯存,DPO 訓練需要 14GB 顯存

  • 訓練數據:使用來自 BAAI(北京智源人工智能研究院)的數據集,包括用于預訓練的 160 億 tokens、用于微調的 900 萬條樣本,以及用于偏好優化的 6 萬條樣本。

數據集

魔塔社區?BAAI/IndustryCorpus2 數據集,根據需要下載


# 下載預訓練數據集
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'film_entertainment/*/high*' --local_dir 'data/pt' # 數據量較大,英文文件選擇前3個文件modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'computer_programming_code/*/high*' --local_dir 'data/pt'
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'computer_communication/*/high*' --local_dir 'data/pt' # 數據量較大,英文文件選擇前3個文件modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'tourism_geography/*/high*' --local_dir 'data/pt'
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'artificial_intelligence_machine_learning/*/high*' --local_dir 'data/pt'
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'news_media/*/high*' --local_dir 'data/pt'
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'literature_emotion/*/high*' --local_dir 'data/pt' # 數據量較大,英文文件選擇前3個文件modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'accommodation_catering_hotel/*/high*' --local_dir 'data/pt'
modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'current_affairs_government_administration/*/high*' --local_dir 'data/pt' # 數據量較大,英文文件選擇前3個文件modelscope download --dataset 'BAAI/IndustryCorpus2' --include 'mathematics_statistics/*/high*' --local_dir 'data/pt'

查看下數據

dataset = load_dataset("parquet", data_files="mini_data/pt/accommodation_catering_hotel/chinese/high/rank_00000.parquet", split="train")
print(dataset[0])

# 大概這么個結構
{"text": "馬亮:如何破解外賣騎手的\"生死劫\"\n在消費至上的今天,企業不應道德綁架消費者,讓消費者為企業的偽善埋單。。。。。。","alnum_ratio": 0.9146919431,"avg_line_length": 158.25,"char_rep_ratio": 0.044444444400000005,"flagged_words_ratio": 0.0,"max_line_length": 223,"num_words": 404,"perplexity": 858.6,"quality_score": 4.0625,"special_char_ratio": 0.1000526593,"word_rep_ratio": 0.088772846,"_id": 200200005357,"industry_type": "住宿_餐飲_酒店"
}

這個結構是一個經過質量分析或過濾的訓練樣本的 JSON 表示,用于語言模型訓練前的數據評估或篩選階段。它除了包含原始文本(text)外還包含了一系列用來衡量數據質量的統計特征指標,用于判斷該樣本是否值得保留用于訓練。

🔹 質量指標字段說明:

字段名說明
alnum_ratio字母數字字符所占比例。用于判斷文本是否主要為自然語言(而非亂碼或表格類數據)
avg_line_length平均每行字符數。可能反映文本結構是否合理(過長/過短)
char_rep_ratio字符重復率。例如“哈哈哈哈哈哈”這種重復率就很高
flagged_words_ratio敏感詞或不良詞匯占比(0 表示未檢測到敏感詞)
max_line_length最長一行的字符數。可用于過濾極端異常格式文本
num_words詞數總計。用于衡量樣本長度
perplexity使用某個語言模型評估的困惑度(perplexity)。數值越低,表示文本越“正常”或模型越容易預測它
quality_score綜合質量評分。可能是上述特征加權后的結果,衡量樣本是否值得用于訓練
special_char_ratio特殊字符(如 #¥%&* 等)在文本中的占比
word_rep_ratio單詞重復率(如“外賣外賣外賣平臺”)

訓練邏輯

加載數據集

# 加載數據集并進行預處理
directories = ["accommodation_catering_hotel","artificial_intelligence_machine_learning","computer_communication","computer_programming_code","film_entertainment","literature_emotion","news_media","tourism_geography","current_affairs_government_administration","mathematics_statistics",
]
data_files = find_files(directories)
dataset = load_dataset("parquet", data_files=data_files, split="train", columns=["text"]) # 只保留text字段
dataset = dataset.shuffle(seed=42)

數據清洗,將原始文本 → 添加結束符 → 分詞 → 拼接成一長串 → 按 block_size 切成多個訓練用的樣本塊(每塊長度一致),給每條文本加上自定義的“結束符” <|im_end|>,把所有樣本的 token 串接在一起(例如把多個 [101,102] 合并為 [101,102,103,104,...]),這是因為 GPT 模型的預訓練目標是連續預測序列,所以訓練輸入是一個“連續的 token 流”。

計算總長度并對齊

  • 得到拼接后 token 總長度(例如 10,356)

  • 只保留整除 block_size(1024)的部分,截斷掉尾部多余部分,例如:10356 → 10240(保留完整的 10 塊)切成 1024 個 token 一塊的樣本,每隔 1024 個 token 分一塊,生成多個訓練樣本,輸出結構:

{"input_ids": [[token1...token1024], [token1025...token2048], ...],"attention_mask": 同理
}

參考預訓練代碼

def preprocess_dataset(examples):"""預處理預訓練數據集,將文本分詞并分塊"""eos_token = "<|im_end|>"text_examples = [text + eos_token for text in examples["text"]]  # 添加結束符tokenized_examples = tokenizer(text_examples, add_special_tokens=False)# 將分詞結果拼接并分塊concatenated_examples = {k: list(chain(*tokenized_examples[k])) for k in tokenized_examples.keys()}total_length = len(concatenated_examples[list(concatenated_examples.keys())[0]])block_size = 1024  # 分塊大小total_length = (total_length // block_size) * block_size  # 對齊塊大小result = {k: [t[i : i + block_size] for i in range(0, total_length, block_size)]for k, t in concatenated_examples.items()}return result# 應用預處理函數
train_dataset = dataset.map(preprocess_dataset,batched=True,batch_size=5000,remove_columns=dataset.column_names,num_proc=16,
)

,原來有很多條文本,現在經過這段預處理函數:

  • 文本 → 拼接 → 分詞 → 連續 token 序列 → 按塊切分

  • 輸出的每個樣本都是 1024 個 token 的一段,可直接送入語言模型進行訓練(如 GPT)

數據預處理

訓練配置

預訓練

accelerate_config.yaml 文件包含了用于配置訓練環境的參數。以下是各個配置項的含義:

  • compute_environment: 指定計算環境,這里為本地機器 (LOCAL_MACHINE)。
  • debug: 調試模式,設置為 false 表示不啟用調試。
  • deepspeed_config: 包含與 DeepSpeed 相關的配置:
    • gradient_accumulation_steps: 梯度累積步數,這里設置為 16。
    • gradient_clipping: 梯度裁剪值,防止梯度過大,這里為 1.0。
    • offload_optimizer_device: 優化器的卸載設備,這里為 none 表示不卸載。
    • offload_param_device: 參數的卸載設備,這里為 none
    • zero3_init_flag: 是否啟用 ZeRO-3 初始化,這里為 false
    • zero_stage: ZeRO 優化的階段,這里設置為 2。
  • distributed_type: 分布式訓練類型,這里為 DEEPSPEED
  • downcast_bf16: 是否降低 bf16 精度,這里設置為 'no'。
  • enable_cpu_affinity: 是否啟用 CPU 親和性,設置為 false
  • machine_rank: 當前機器在分布式訓練中的排名,這里為 0。
  • main_training_function: 主訓練函數的名稱,這里為 main
  • mixed_precision: 混合精度訓練,這里使用 bf16。
  • num_machines: 參與訓練的機器數量,這里為 1。
  • num_processes: 每臺機器上的進程數量,這里為 2。
  • rdzv_backend: rendezvous 后端,這里為 static
  • same_network: 是否在同一網絡中,設置為 true
  • tpu_env: TPU 環境配置,這里為空。
  • tpu_use_cluster: 是否使用 TPU 集群,設置為 false
  • tpu_use_sudo: 是否使用 sudo 權限,設置為 false
  • use_cpu: 是否使用 CPU 進行訓練,設置為 false

這些配置項幫助用戶設置和優化模型訓練過程,尤其是在使用 DeepSpeed 進行分布式訓練時, 配置參考

compute_environment: LOCAL_MACHINE
debug: false
deepspeed_config:gradient_accumulation_steps: 16gradient_clipping: 1.0offload_optimizer_device: noneoffload_param_device: nonezero3_init_flag: falsezero_stage: 2
distributed_type: DEEPSPEED
downcast_bf16: 'no'
enable_cpu_affinity: false
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 2
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

訓練邏輯

# 已經下載了Qwen2.5-0.5B-Instruct地址
model_path = "./models/Qwen2.5-0.5B-Instruct"
config = AutoConfig.from_pretrained(model_path)# 調整模型配置
config.num_attention_heads = 16
config.num_key_value_heads = 4
config.hidden_size = 1024
config.num_hidden_layers = 48# 加載模型
model = AutoModelForCausalLM.from_config(config, torch_dtype=torch.bfloat16, attn_implementation="flash_attention_2")# 加載分詞器
tokenizer = AutoTokenizer.from_pretrained(model_path)# 訓練參數配置
training_args = TrainingArguments(output_dir=output_path,overwrite_output_dir=True,learning_rate=1e-4,warmup_ratio=0.1,lr_scheduler_type="cosine",num_train_epochs=1,per_device_train_batch_size=12,gradient_accumulation_steps=16,save_steps=100_000,save_total_limit=3,bf16=True,# save_only_model=True,logging_steps=20,
)# 初始化Trainer
trainer = Trainer(model=model,args=training_args,data_collator=collator,train_dataset=train_dataset,
)

使用accelerate 加速訓練

模型參數量: 576851712
表示模型總共有 576,851,712 個參數,也就是約 5.77 億參數(≈ 577M)。

和之前用的MiniMind架構的模型比訓練速度要慢很多,所以直接跳過預訓練使用基座進行微調

SFT微調

?trl 配置

# 訓練參數配置
training_args = SFTConfig(output_dir=output_path,                 # 訓練完成后模型保存的目錄overwrite_output_dir=True,             # 如果目錄已存在則覆蓋原模型learning_rate=1e-5,                    # 學習率,SFT階段建議小一點warmup_ratio=0.1,                      # 熱身步數比例,用于逐漸增加學習率lr_scheduler_type="cosine",            # 學習率調度策略:余弦退火num_train_epochs=3,                    # 訓練輪數per_device_train_batch_size=12,        # 每張顯卡的batch大小(顯存不夠就調小)gradient_accumulation_steps=16,        # 梯度累計步數,總batch大小 = 12 × 16 = 192save_strategy="epoch",                 # 每輪結束保存一次模型save_total_limit=3,                    # 最多保存3個checkpoint,舊的自動刪掉bf16=True,                             # 使用 bfloat16 進行訓練(比 fp16 更穩定,NVIDIA A100/H100 支持)logging_steps=20,                      # 每20步打印一次日志
)# 初始化Trainer
trainer = SFTTrainer(model=model,                           # 使用的模型(已初始化)args=training_args,                    # 上面定義的訓練參數train_dataset=dataset,                 # 訓練數據集tokenizer=tokenizer,                   # 分詞器formatting_func=formatting_prompts_func, # 格式化數據的函數,把樣本轉換成 prompt + completiondata_collator=collator,               # 數據整理器(例如自動填充、構建input_ids等)
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81032.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hysAnalyser特色的TS流編輯、剪輯和轉存MP4功能說明

摘要 hysAnalyser 是一款特色的 MPEG-TS 數據分析工具&#xff0c;融合了常規TS文件的剪輯&#xff0c;轉存功能&#xff0c;可用于平常的視頻開發和測試。 本文詳細闡述了對MPEG-TS 流的節目ID&#xff0c;名稱&#xff0c;PID&#xff0c;時間戳&#xff0c;流類型&#xff…

前端[插件化]設計思想_Vue、React、Webpack、Vite、Element Plus、Ant Design

前端插件化設計思想旨在提升應用的可擴展性、可維護性和模塊化程度。這種思想不僅體現在框架&#xff08;如 Vue、React&#xff09;中&#xff0c;也廣泛應用于構建工具&#xff08;如 Webpack、Vite&#xff09;以及 UI 庫&#xff08;如 Element Plus、Ant Design&#xff0…

2025年高防IP與游戲盾深度對比:如何選擇最佳防護方案?

2025年&#xff0c;隨著DDoS攻擊規模的指數級增長和混合攻擊的常態化&#xff0c;高防IP與游戲盾成為企業網絡安全的核心選擇。然而&#xff0c;兩者在功能定位、技術實現及適用場景上存在顯著差異。本文結合最新行業實踐與技術趨勢&#xff0c;全面解析兩者的優劣&#xff0c;…

日志根因分析:Elastic Observability 的異常檢測與日志分類功能

作者&#xff1a;來自 Elastic Bahubali Shetti Elastic Observability 不僅提供日志聚合、指標分析、APM 和分布式追蹤&#xff0c;Elastic 的機器學習能力還能幫助分析問題的根因&#xff0c;讓你將時間專注于最重要的任務。 隨著越來越多的應用程序遷移到云端&#xff0c;收…

Linux火墻管理及優化

網絡環境配置 使用3個新的虛擬機【配置好軟件倉庫和網絡的】 F1 192.168.150.133 NAT F2 192.168.150.134 192.168.10.20 NAT HOST-ONLY 網絡適配僅主機 F3 192.168.10.30 HOST-ONLY 網絡適配僅主機 1 ~]# hostnamectl hostname double1.timinglee.org 【更…

java配置webSocket、前端使用uniapp連接

一、這個管理系統是基于若依框架&#xff0c;配置webSocKet的maven依賴 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 二、配…

基于Yolov8+PyQT的老人摔倒識別系統源碼

概述 ??基于Yolov8PyQT的老人摔倒識別系統??&#xff0c;該系統通過深度學習算法實時檢測人體姿態&#xff0c;精準識別站立、摔倒中等3種狀態&#xff0c;為家庭或養老機構提供及時預警功能。 主要內容 ??完整可運行代碼?? 項目采用Yolov8目標檢測框架結合PyQT5開發…

Oracle 創建外部表

找別人要一下數據&#xff0c;但是他發來一個 xxx.csv 文件&#xff0c;怎么辦&#xff1f; 1、使用視圖化工具導入 使用導入工具導入&#xff0c;如 DBeaver&#xff0c;右擊要導入的表&#xff0c;選擇導入數據。 選擇對應的 csv 文件&#xff0c;下一步就行了&#xff08;如…

【華為OD- B卷 01 - 傳遞悄悄話 100分(python、java、c、c++、js)】

【華為OD- B卷 01 - 傳遞悄悄話 100分(python、java、c、c++、js)】 題目 給定一個二叉樹,每個節點上站一個人,節點數字表示父節點到該節點傳遞悄悄話需要花費的時間。 初始時,根節點所在位置的人有一個悄悄話想要傳遞給其他人,求二叉樹所有節點上的人都接收到悄悄話花…

房貸利率計算前端小程序

利率計算前端小程序 視圖效果展示如下&#xff1a; 在這里插入代碼片 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

自制操作系統day8 (鼠標數據取得、通往32位模式之路、A20GATE、切換到保護模式、控制寄存器cr0-cr4以及cr8、ALIGNB)

day8 鼠標數據取得方法 fifo8_init(&mousefifo, 128, mousebuf); for (;;) { io_cli(); if (fifo8_status(&keyfifo) fifo8_status(&mousefifo) 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) ! 0) { i fifo8_get(&keyfifo); io_sti(); spr…

IP大科普:住宅IP、機房IP、原生IP、雙ISP

不同類型的IP在跨境電商、廣告營銷、網絡技術、數據收集等領域都有廣泛應用&#xff0c;比如常見的住宅IP、機房IP、原生IP、雙ISP等&#xff0c;這些IP分別都有什么特點&#xff0c;發揮什么作用&#xff0c;適合哪些業務場景&#xff1f; 一、IP類型及其作用 1.住宅IP 住宅…

Elasticsearch面試題帶答案

Elasticsearch面試題帶答案 Elasticsearch面試題及答案【最新版】Elasticsearch高級面試題大全(2025版),發現網上很多Elasticsearch面試題及答案整理都沒有答案,所以花了很長時間搜集,本套Elasticsearch面試題大全,Elasticsearch面試題大匯總,有大量經典的Elasticsearch面…

Eigen與OpenCV矩陣操作全面對比:最大值、最小值、平均值

功能對比總表 功能Eigen 方法OpenCV 方法主要區別最大值mat.maxCoeff(&row, &col)cv::minMaxLoc(mat, NULL, &maxVal, NULL, &maxLoc)Eigen需要分開調用&#xff0c;OpenCV一次獲取最小值mat.minCoeff(&row, &col)cv::minMaxLoc(mat, &minVal, NU…

echarts之雙折線漸變圖

vue3echarts實現雙折線漸變圖 echarts中文官網&#xff1a;https://echarts.apache.org/examples/zh/index.html 效果圖展示&#xff1a; 整體代碼如下&#xff1a; <template><div id"lineChart" style"width:100%;height:400px;"></di…

MD編輯器推薦【Obsidian】含下載安裝和實用教程

為什么推薦 Obsidian &#xff1f; 免費 &#xff08;Typora 開始收費了&#xff09;Typora 實現的功能&#xff0c;它都有&#xff01;代碼塊可一鍵復制 文件目錄支持文件夾 大綱支持折疊、搜索 特色功能 – 白板 特色功能 – 關系圖譜 下載 https://pan.baidu.com/s/1I1fSly…

vue 鼠標經過時顯示/隱藏其他元素

方式一&#xff1a; 使用純css方式 , :hover是可以控制其他元素 1、 當兩個元素是父子關系 <div class"all_" ><div> <i class"iconfont icon-sun sun"></i></div> </div> .all_{} .sun {display: none; /* 默認…

靜態網站部署:如何通過GitHub免費部署一個靜態網站

GitHub提供的免費靜態網站托管服務可以無需擔心昂貴的服務器費用和復雜的設置步驟&#xff0c;本篇文章中將一步步解如何通過GitHub免費部署一個靜態網站&#xff0c;幫助大家將創意和作品快速展現給世界。 目錄 了解基礎情況 創建基礎站點 在線調試站點 前端項目部署 部署…

Pytorch里面多任務Loss是加起來還是分別backward? | Pytorch | 深度學習

當你在深度學習中進入“多任務學習(Multi-task Learning)”的領域,第一道關卡可能不是設計網絡結構,也不是準備數據集,而是:多個Loss到底是加起來一起backward,還是分別backward? 這個問題看似簡單,卻涉及PyTorch計算圖的構建邏輯、自動求導機制、內存管理、任務耦合…

基于DPABI提取nii文件模板的中心點坐標

基于DPABI提取nii文件模板的中心點坐標 在使用DPABI&#xff08;Data Processing Assistant for Resting-State fMRI&#xff09;處理NIfTI&#xff08;.nii&#xff09;文件時&#xff0c;可以通過以下步驟提取模板中每個坐標點的中心點坐標&#xff1a;https://wenku.csdn.n…