采用LLaMa-Factory對QWen大模型實現微調(效果很好)

前言

? ? ? ?LLaMA-factory是一個非常有用的開源框架。關于利用llama-factory實現大模型的微調,研究了有一個多月了,終于相對成功的微調了一個QWen的大模型。其中的曲折愿和大家分享!

一、源碼的下載

在github上的網址:

GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)

不采用git,直接download,如圖:

下載完畢后,解壓后的效果如下:

二、在AnaConda配置完成安裝

啟動AnaConda的命令行:

查看現有的虛擬環境,如下圖:

(可見我當前的系統安裝了多個Python版本的環境,這個可以參考我的另外一篇博客:

https://quickrubber.blog.csdn.net/article/details/140995598)

激活Python311

進入LLaMa-Factory的下載目錄,如下圖:

安裝依賴:

下載得速度還是比較快的,然后如下:

三、啟動LLaMa-factory

自動打開了瀏覽器(這個啟動過程大約需要十多秒),如下圖:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

嘗試直接掛接Ollama的本地大模型,發現無法成功,具體可以參看我的另一篇博客:

llama-Factory不宜直接掛接Ollama的大模型-CSDN博客

所以,考慮直接采用魔搭社區下載的大模型。

四、訪問本地的千問(QWen)大模型對比微調結果

4.1、從魔搭社區下載大模型文件

采用的還是比較輕量級的QWen2.5:0.5B。

鏈接:魔搭社區

直接逐個下載即可(當然也可用命令行下載,在此不贅述)

下載完畢后,文件夾中的文件如下:

4.2、PyCharm工程訪問大模型文件實現測試1

代碼如下:

from transformers import AutoModelForCausalLM, AutoTokenizer
#模型文件采用在線的方式進行
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_before_fine_tuning"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

運行結果如下:

??????????????????????????????????(結果圖1)

4.3、采用LLaMa-factory實現模型的微調

選定模型位置:

選擇一個llama-factory自帶的一個數據集:

開始訓練:

控制臺的訓練顯示1:

查看資源管理器,發現GPU已100%被占用:

訓練完畢(2080顯卡用時1小時):

完畢后可以得到一個訓練記錄:

點開文件夾:

4.4、采用llama-factory將微調后的模型導出

導出完畢:

得到的模型文件夾內容:

4.5、將用于微調的數據集中數據測試微調后的模型

代碼:

from transformers import AutoModelForCausalLM, AutoTokenizer#模型文件采用在線的方式進行
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_after_fine_tuning"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

運行效果:

???????????????????????????????????(結果圖2)

顯然“結果圖2”比“結果圖1”(4.2)更加接近微調數據集的答案。

微調數據集中對應的內容:

換行打印的內容如下:

可見,可能人名未必對的上,但是意思比微調前接近了。

人名對不上的緣故是,微調才運行了3個epoch,持續微調,降低誤差后。可能更準確。

五、自定義數據集進行微調

5.1、5條數據的數據集

alpaca_en_demo.json有1000條數據集,所以微調起來慢。

我選取了其中5條,構成了新的alpaca_en_demo_mychange.json

關于alpaca_en_demo_mychange.json的內容:

在dataset_info.json中添加數據信息

為了方便微調數據集的加載,必須修改dataset_info.json,添加自定義數據集的信息:

5.2、按照4.3方式微調

重啟llama-factory:

然后,開始重新訓練:

訓練完畢(2080顯卡用時2分鐘):

得到新的訓練結果:

5.3、導出新的大模型文件

具體方法參照4.4

5.4、最新大模型文件測試

代碼:

from transformers import AutoModelForCausalLM, AutoTokenizer
#model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name=r"E:\models_\Qwen2.5_0.5_after_fine_tuning_5"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)instruction = "Produce a list of the top 5 NHL players in 2021."
input_text = ""messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": f"Instruction: {instruction}\nInput: {input_text}"}
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("Model output:", response)

運行結果:

原微調數據集:

對比微調數據集,第二個名字(Conner McDavid)完全能對上。所以微調還是有了改進。

但是結果還是不滿意。

5.5、加大epoch數量(500)進行微調

???訓練完畢(大約用了半小時):

再同樣進行模型文件合并導出,重新用Python程序進行測試,發現仍然還是只有一個球員名字對上,效果還是不滿意。(盡管loss誤差已經是零了)

5.6、重磅級別的改進

在Python問答環節中增加了一個sample=False的設置:

運行效果如下:

對比微調用的數據集中的內容:

Good!終于完全對上了!微調成功!

測試程序的對應源碼,可以從此處下載:

https://download.csdn.net/download/quickrubber/90778391

?????????????????????????????????????????????????????????????

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

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

相關文章

深入理解深度Q網絡DQN:基于python從零實現

DQN是什么玩意兒? 深度Q網絡(DQN)是深度強化學習領域里一個超厲害的算法。它把Q學習和深度神經網絡巧妙地結合在了一起,專門用來搞定那些狀態空間維度特別高、特別復雜的難題。它展示了用函數近似來學習價值函數的超能力&#xf…

機械物理:水力發電站工作原理是什么?

水利發電站的工作原理是將水的勢能轉化為電能,主要依賴水體的重力作用與能量轉換設備。以下是其核心步驟和組成部分的詳細解釋: 1. 蓄水與勢能積累 水壩與水庫:通過建造水壩攔截河流,形成水庫蓄水。水位升高后,水體的…

[面試]SoC驗證工程師面試常見問題(五)TLM通信篇

SoC驗證工程師面試常見問題(五) 摘要:UVM (Universal Verification Methodology) 中的 TLM (Transaction Level Modeling) 通信是一種用于在驗證組件之間傳遞事務(Transaction)的高層次抽象機制。它通過端口(Port)和導出(Export)實現組件間的解耦通信,避免了信…

CAD屬性圖框值與Excel聯動(CAD塊屬性導出Excel、excel更新CAD塊屬性)——CAD c#二次開發

CAD插件實現塊屬性值與excel的互動,效果如下: 加載dll插件(CAD 命令行輸入netload ,運行xx即可導出Excel,運行xx1即可根據excel更新dwg塊屬性值。) 部分代碼如下 // 4. 開啟事務更新CAD數據using (Transact…

【數據挖掘】Apriori算法

Apriori算法是經典的關聯規則挖掘算法,用于從事務型數據庫中發現頻繁項集和強關聯規則,特別常用于購物籃分析等場景。 🧠 核心思想(Apriori原則) 一個項集是頻繁的,前提是它的所有子集也必須是頻繁的。 即&…

單鏈表設計與實現

01. 單鏈表簡介 在數據結構中,單鏈表的實現可以分為 帶頭結點 和 不帶頭結點 兩種方式,這里我們討論第二種方式。 頭結點:鏈表第一個節點不存實際數據,僅作為輔助節點指向首元節點(第一個數據節點)。頭指…

【論文閱讀】——Articulate AnyMesh: Open-Vocabulary 3D Articulated Objects Modeling

文章目錄 摘要一、介紹二、相關工作2.1. 鉸接對象建模2.2. 部件感知3D生成 三、方法3.1. 概述3.2. 通過VLM助手進行可移動部件分割3.3. 通過幾何感知視覺提示的發音估計3.4. 通過隨機關節狀態進行細化 四、實驗4.1. 定量實驗發音估計設置: 4.2. 應用程序 五、結論六、思考 摘要…

Zookeeper單機版安裝部署

目錄 1.1、概述1.2、系統環境1.3、部署流程1.3.1、下載安裝包1.3.2、解壓文件1.3.3、創建數據目錄和日志目錄1.3.4、配置ZooKeeper1.3.5、啟動ZooKeeper服務1.3.6、連接和驗證 1.4、Zookeeper服務管理命令1.4.1、啟動Zookeeper服務1.4.2、停止Zookeeper服務1.4.3、查看Zookeepe…

在 Elasticsearch 中刪除文檔中的某個字段

作者:來自 Elastic Kofi Bartlett 探索在 Elasticsearch 中刪除文檔字段的方法。 更多有關 Elasticsearch 文檔的操作,請詳細閱讀文章 “開始使用 Elasticsearch (1)”。 想獲得 Elastic 認證?查看下一期 Elasticsear…

元數據和主數據

元數據和主數據是數據管理中的兩個關鍵概念,其核心區別如下: 1. 定義與本質 元數據(Metadata) “關于數據的數據”,用于描述數據的屬性、結構、來源、用途等上下文信息。 示例:數據庫表的字段名稱、數據類型…

java的Stream流處理

Java Stream 流處理詳解 Stream 是 Java 8 引入的一個強大的數據處理抽象,它允許你以聲明式方式處理數據集合(類似于 SQL 語句),支持并行操作,提高了代碼的可讀性和處理效率。 一、Stream 的核心概念 1. 什么是 Str…

llama-Factory不宜直接掛接Ollama的大模型

前言 llama-Factory嘗試使用Ollama本地安裝的大模型。 一、在Ollama中安裝QWen 安裝qwen:0.5b 安裝完成了: 同理安裝qwen2.5:0.5b 安裝完畢后,再用ollama list進行查看: 我們在chatbox中進行查看: 說明這兩個大模型,…

基于WSL用MSVC編譯ffmpeg7.1

在windows平臺編譯FFmpeg,網上的大部分資料都是推薦用msys2mingw進行編譯。在win10平臺,我們可以采用另一種方式,即wslmsvc 實現window平臺的ffmpeg編譯。 下面將以vs2022ubuntu22.04 為例,介紹此方法 0、前期準備 安裝vs2022 &…

vue3+vite項目引入tailwindcss

從2025年1月tailwindcss4.0發布開始使用tailwindcss比之前簡化很多 1,安裝 yarn add tailwindcss tailwindcss/vite2,配置vite.config.js import tailwindcss from tailwindcss/vite;...plugins: [tailwindcss(),...] ...3,在主css文件頂部添加 注意一定是css文件,不能是sc…

藍牙RFCOMM協議概述

RFCOMM概述 概念 RFCOMM 協議提供了對 L2CAP 協議上的串行端口的模擬。該協議基于 ETSI 標準 GSM 07.10。 RFCOMM 采用與 TS07.10 相同的字節序列方式。所有二進制數字都按照從低位到高位的順序,從左至右讀。 兩個使用RFCOMM通信的藍牙設備可以打開多個仿真串行端…

[工具]B站緩存工具箱 (By 郭逍遙)

📌 項目簡介 B站緩存工具箱是一個多功能的B站緩存工具,包含視頻下載、緩存重載、文件合并及系統設置四大核心功能。基于yutto開發,采用圖形化界面操作,極大簡化B站資源獲取與管理流程。 工具可以直接將原本緩存的視頻讀取&#…

算法訓練營第十三天|226.翻轉二叉樹、101. 對稱二叉樹、 104.二叉樹的最大深度、111.二叉樹的最小深度

遞歸 遞歸三部曲: 1.確定參數和返回值2.確定終止條件3.確定單層邏輯 226.翻轉二叉樹 題目 思路與解法 第一想法: 遞歸,對每個結點進行反轉 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…

sunset:Solstice靶場

sunset:Solstice https://www.vulnhub.com/entry/sunset-solstice,499/ 1,將兩臺虛擬機網絡連接都改為NAT模式 2,攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.182,靶場IP192.168.23.244 3&#xff…

AZScreenRecorder最新版:功能強大、操作簡便的手機錄屏軟件

AZScreenRecorder最新版是一款功能強大的手機錄屏軟件,專為安卓設備設計。它無需ROOT權限,支持無限錄制時長,操作簡單,錄制過程中可以隨時暫停,滿足不同用戶的個性化錄屏需求。此外,用戶還可以自定義分辨率…

模塊自動導入的小工具

import { ref, reactive, onMounted } from vue import { useRoute, useRouter } from vue-router項目里很多文件都需要引入這些公共庫,比較繁瑣,使用一個小工具可以自動導入,就不需要在每個文件里面都寫這些導入的代碼了。 通過命令行下載安…