unsloth微調QwQ32B(4bit)

unsloth微調QwQ32B(4bit)

GPU: 3090 24G

unsloth安裝部署

  • pip 安裝

    pip install unsloth --index https://pypi.mirrors.usrc.edu.cn/simple
    
    source /etc/network_turbopip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git
    

    ? image-20250318225453359


注冊Wandb以監控模型微調過程

  • wandb地址

    https://wandb.ai/site

    ? image-20250322235532991

  • 登錄

    下載

    pip install wandb
    

    使用api-key登錄

    wandb login
    

    ?

  • 使用官網示例看一看

    備注:

    1. 需要聯網
    2. 需要將key改為自己的
    3. entity需要提前設立
    import random
    import wandbwandb.login(key="api-key")# Start a new wandb run to track this script.
    run = wandb.init(# Set the wandb entity where your project will be logged (generally your team name).entity="qinchihongye-pa",# Set the wandb project where this run will be logged.project="project_test",# Track hyperparameters and run metadata.config={"learning_rate": 0.02,"architecture": "CNN","dataset": "CIFAR-100","epochs": 10,},
    )# Simulate training.
    epochs = 10
    offset = random.random() / 5
    for epoch in range(2, epochs):acc = 1 - 2**-epoch - random.random() / epoch - offsetloss = 2**-epoch + random.random() / epoch + offset# Log metrics to wandb.run.log({"acc": acc, "loss": loss})# Finish the run and upload any remaining data.
    run.finish()
    

    ? image-20250323001331600

    ? image-20250323001400324


下載QwQ32B量化模型

  • huggingface地址(unsloth量化的4bit,比Q4_K_M量化的損失精度更小)

    https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bit

    復制名稱

    unsloth/QwQ-32B-unsloth-bnb-4bit

  • 假設當前目錄為

    /root/lanyun-tmp

  • 創建文件夾統一存放Huggingface下載的模型

    mkdir Hugging-Face 
    mkdir -p Hugging-Face/QwQ-32B-unsloth-bnb-4bit
    
  • 配置鏡像源

    vim ~/.bashrc
    

    填入以下兩個,以修改HuggingFace 的鏡像源 、模型保存的默認

    export HF_ENDPOINT=https://hf-mirror.com
    export HF_HOME=/root/lanyun-tmp/Hugging-Face

    重新加載,查看環境變量是否生效

    source ~/.bashrcecho $HF_ENDPOINT
    echo $HF_HOME
    
  • 安裝 HuggingFace 官方下載工具

    pip install -U huggingface_hub
    
  • 執行下載模型的命令

    huggingface-cli download --resume-download unsloth/QwQ-32B-unsloth-bnb-4bit --local-dir  /root/lanyun-tmp/Hugging-Face/QwQ-32B-unsloth-bnb-4bitHugging-Face/QwQ-32B-unsloth-bnb-4bit
    

    或者使用python下載

    from huggingface_hub import snapshot_download
    snapshot_download(repo_id = "unsloth/QwQ-32B-unsloth-bnb-4bit",local_dir = "/root/lanyun-tmp/Hugging-Face/QwQ-32B-unsloth-bnb-4bit",
    )
    

transformers庫調用示例

  • 代碼

    from transformers import AutoModelForCausalLM, AutoTokenizermodel_name = "/root/lanyun-tmp/Hugging-Face/QwQ-32B-unsloth-bnb-4bit"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="cuda:0",
    )
    tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = "你好"
    messages = [{"role": "user", "content": prompt}
    ]
    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=32768
    )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(response)
    

    ? image-20250319224154469

  • 顯存占用:23G左右。

    ? image-20250319224423863


vllm啟動示例

  • 啟動

    cd /root/lanyun-tmp/Hugging-Facevllm serve ./QwQ-32B-unsloth-bnb-4bit \
    --quantization bitsandbytes \
    --load-format bitsandbytes \
    --max-model-len 500 \
    --port 8081
    
  • 調用代碼

    from openai import OpenAI
    import openaiopenai.api_key = '1111111' # 這里隨便填一個
    openai.base_url = 'http://127.0.0.1:8081/v1'def get_completion(prompt, model="QwQ-32B"):client = OpenAI(api_key=openai.api_key,base_url=openai.base_url)messages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model=model,messages=messages,stream=False)return response.choices[0].message.contentprompt = '你好,請幽默的介紹下你自己,不少于300字'
    get_completion(prompt, model="./QwQ-32B-unsloth-bnb-4bit")
    

cot數據集

  • FreedomIntelligence/medical-o1-reasoning-SFT

    https://huggingface.co/datasets/FreedomIntelligence/medical-o1-reasoning-SFT

  • 英文數據集下載

    from datasets import load_dataset
    import rich# Login using e.g. `huggingface-cli login` to access this dataset
    ds = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "en")rich.print(ds['train'][0])
    

    ? image-20250322102329936

  • 中文數據集下載

    from datasets import load_dataset
    import rich# Login using e.g. `huggingface-cli login` to access this dataset
    ds = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "zh")rich.print(ds['train'][0])
    

    ? image-20250322102403774

  • 下載完成后會看到在HuggingFace目錄下的datasets目錄中有剛剛下載的數據

    ll /root/lanyun-tmp/Hugging-Face/datasets/
    

    ? image-20250322102756924


unsloth加載QwQ32b模型

  • unsloth支持直接加載模型并推理,先加載模型

    from unsloth import FastLanguageModelmax_seq_length = 2048
    dtype = None
    load_in_4bit = True # 4bitmodel,tokenizer = FastLanguageModel.from_pretrained(model_name = "/root/lanyun-tmp/Hugging-Face/QwQ-32B-unsloth-bnb-4bit/",max_seq_length = max_seq_length,dtype = dtype,load_in_4bit = load_in_4bit,
    )
    

    ? image-20250323002404635

    顯存占用22G左右

    ? image-20250323002435203

  • 推理

    # 將模型調整為推理模式
    FastLanguageModel.for_inference(model)def QwQ32b_infer(question):# prompt模板prompt_style_chat = """請寫出一個恰當的回來來完成當前對話任務。### Instruction:你是一名助人為樂的助手。### Question:{}### Response:<think>{}"""# [prompt_style_chat.format(question,"")]inputs = tokenizer([prompt_style_chat.format(question, "")],return_tensors="pt").to("cuda")outputs = model.generate(input_ids = inputs.input_ids,max_new_tokens=2048,use_cache=True,)response = tokenizer.batch_decode(outputs)return response[0].split("### Response:")[1]question = "證明根號2是無理數"
    response = QwQ32b_infer(question)
    

    ? image-20250323003010238


模型微調

  • 測試:使用微調數據集進行測試

    question_1 = "根據描述,一個1歲的孩子在夏季頭皮出現多處小結節,長期不愈合,且現在瘡大如梅,潰破流膿,口不收斂,頭皮下有空洞,患處皮膚增厚。這種病癥在中醫中診斷為什么病?"question_2 = "一個生后8天的男嬰因皮膚黃染伴發熱和拒乳入院。體檢發現其皮膚明顯黃染,肝脾腫大和臍部少量滲液伴臍周紅腫。在此情況下,哪種檢查方法最有助于確診感染病因?"response_1 = QwQ32b_infer(question_1)
    response_2 = QwQ32b_infer(question_2)print(response_1)
    print(response_2)
    

    ? image-20250323004511358

    ? image-20250323005528685

  • 加載并處理數據,選擇訓練集前500條進行最小可行性實驗

    import os
    from datasets import load_dataset# 問答提示詞模板
    train_prompt_style = """下面是描述任務的指令,與提供進一步上下文的輸入配對。編寫適當完成請求的響應。在回答之前,仔細思考問題,并創建逐步的思想鏈,以確保邏輯和準確的響應。### Instruction:
    您是一位在臨床推理、診斷和治療計劃方面擁有先進知識的醫學專家。請回答以下醫學問題。 ### Question:
    {}### Response:
    <think>
    {}
    </think>
    {}"""# 文本生成結束的基本標記
    EOS_TOKEN = tokenizer.eos_token
    tokenizer.eos_token # '<|im_end|>'# 定義函數,對數據集進行修改
    def formatting_prompts_func(examples):inputs = examples["Question"]cots = examples["Complex_CoT"]outputs = examples["Response"]texts = []for input, cot, output in zip(inputs, cots, outputs):text = train_prompt_style.format(input, cot, output) + EOS_TOKENtexts.append(text)return {"text": texts,}# 先選擇訓練集前500條數據
    dataset = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT","zh", split = "train[0:500]",trust_remote_code=True)
    dataset = dataset.map(formatting_prompts_func, batched = True)import rich
    rich.print(dataset[0])
    rich.print(dataset[0]['text'])
    

    ? image-20250323010653554

  • 將模型設置為微調模式

                           
    # 將模型設置為微調模式
    model = FastLanguageModel.get_peft_model(model,r=4, # r=16 # 低秩矩陣的秩target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj",],lora_alpha=16,lora_dropout=0,  bias="none",  use_gradient_checkpointing="unsloth",  # True or "unsloth" for very long contextrandom_state=1024,use_rslora=False,  loftq_config=None,
    )
    

    ? image-20250323012425940

  • 創建訓練器(有監督微調對象)

    from trl import SFTTrainer
    from transformers import TrainingArguments
    from unsloth import is_bfloat16_supportedtrainer = SFTTrainer(model=model, # 指定需要微調的預訓練模型tokenizer=tokenizer, # 分詞器train_dataset=dataset, # 訓練數據dataset_text_field="text", # 指定數據集中那一列包含訓練文本(在formatting_prompt_func里面指定)max_seq_length=max_seq_length, #最大序列長度,用于控制輸入文本的最大token數量dataset_num_proc=2, # 數據加載的并行進程數args=TrainingArguments(per_device_train_batch_size=1, # 每個GPU/設備的戌年批量大小(較小值適合大模型)gradient_accumulation_steps=4, # 梯度累計步數,相當于batch_size=1*4=4# num_train_epochs = 1, # 如果設置了num_train_epochs,則max_steps失效warmup_steps=5, # 預熱步數,初始階段學習率較低,然后逐步升高max_steps=60,# 最大訓練步數learning_rate=2e-4, # 學習率fp16=not is_bfloat16_supported(),  # 如果GPU不支持bfloat16,則使用fp16(16位浮點數)bf16=is_bfloat16_supported(), # 如果GPU支持bfloat16,則啟用bf16(訓練更穩定)logging_steps=10, # 每10步記錄一次日志optim="adamw_8bit", # 使用adamw_8bit 8bit adamw優化器減少顯存占用weight_decay=0.01, # 權重衰減 L2正則化,防止過擬合lr_scheduler_type="linear", # 學習率調整策略,線性衰減seed=1024, # 隨機種子,保證實驗結果可復現output_dir="/root/lanyun-tmp/outputs", # 訓練結果的輸出目錄),
    )# 設置wandb(可選則)
    import wandb
    wandb.login(key="api-key")run = wandb.init(entity="qinchihongye-pa",project='QwQ-32B-4bit-FT')# 開始模型微調
    trainer_stats = trainer.train()trainer_status
    

    ? image-20250323155933809

    訓練過程中的顯存占用如上,訓練過程如下

    ? image-20250323160147618

    點擊wandb鏈接,查看訓練過程中的損失函數,學習率,梯度等等的變化。

    ? image-20250323160324517

  • unsloth在微調結束后,會自動更新模型權重(在緩存中),因此無序手動合并集合直接調用微調后的模型

    FastLanguageModel.for_inference(model)new_response_1 = QwQ32b_infer(question_1)
    new_response_2 = QwQ32b_infer(question_2)new_response_1
    new_response_2
    

    ? image-20250323205055248

    ? image-20250323205114604

    可以看到第一個問題還是回答錯了,第二個問題也如舊,可以考慮繼續進行大規模微調,使用全部微調文件+多個epoch。

  • 模型合并

    此時本地保存的模型權重在/root/lanyun-tmp/outputs

    ? image-20250323205516739

    注意,unsloth中默認100步保存一個checkpoint,因為當前steps=60,所以只有一個checkpoint點。

    合并保存為safetensors

    model.save_pretrained_merged("/root/lanyun-tmp/QwQ-Medical-COT-Tiny", tokenizer, save_method = "merged_4bit_forced",#保存為4bit量化)# model.save_pretrained_merged("dir"
    #                              , tokenizer
    #                              , save_method = "merged_16bit",#保存為16bit
    #                             )
    

    合并為GGUF格式(需要量化,非常耗時)

    # model.save_pretrained_gguf("dir"
    #                            , tokenizer
    #                            , quantization_method = "q4_k_m"
    #                           )# model.save_pretrained_gguf("dir"
    #                            , tokenizer
    #                            , quantization_method = "q8_0"
    #                           )# model.save_pretrained_gguf("dir"
    #                            , tokenizer
    #                            , quantization_method = "f16"
    #                           )
    

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

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

相關文章

JavaScript案例0322

以下是一些涵蓋不同高級JavaScript概念和應用的案例&#xff0c;每個案例都有詳細解釋&#xff1a; 案例1&#xff1a;實現 Promise/A 規范的手寫 Promise class MyPromise {constructor(executor) {this.state pending;this.value undefined;this.reason undefined;this.o…

Dify 0.15.3 輸入變量無法被重新賦值問題-解決方法

目錄 一、問題描述 二、解決方法 2.1 原因 2.2 修改源碼 2.3 重新打包 dify-api 鏡像 2.4 修改 docker-compose.yaml 文件 2.5 重啟啟動鏡像 一、問題描述 Dify 0.15.3 是一個比較穩定的版本&#xff0c;Dify 1.0 是一個大版本更新&#xff0c;目前還有很多 Bug。但是&a…

SQL Server查詢計劃操作符(7.3)——查詢計劃相關操作符(11)

7.3. 查詢計劃相關操作符 98&#xff09;Table Scan&#xff1a;該操作符從查詢計劃參數列確定的表中獲取所有數據行。如果其參數列中出現WHERE:()謂詞&#xff0c;則只返回滿足該謂詞的數據行。該操作符為邏輯操作符和物理操作符。該操作符具體如圖7.3-98節點1所示。 圖 7.3-…

數據庫練習2

目錄 1.向heros表中新增一列信息&#xff0c;添加一些約束&#xff0c;并嘗試查詢一些信息 2.課堂代碼練習 插入語句 INSERT INTO 刪除語句DELETE和TRUNCATE 更新語句UPDATE和replace 查詢語句SELECT 條件查詢 select語句中的特殊情況 ???查詢排序 order by 分組查詢…

Java架構師成長之路

概述 本教程主要從6個方面&#xff0c;全面講解Java技術棧的知識。 1.性能調優 深入理解MySQL底層原理、索引邏輯&#xff0c;數據結構與算法。使用Explain進行優化分析MVCC原理剖析日志機制解析 2.框架源碼 掌握Spring底層原理帶你手寫一個Spring解析IOC、AOP源碼、以及事…

資金管理策略思路

詳細描述了完整交易策略的實現細節&#xff0c;主要包括輸入參數、變量定義、趨勢判斷、入場與出場條件、止損與止盈設置等多個方面。 輸入參數&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多頭入場的前一日波動范圍的倍數。 EntryFrS (.3)&#xff1…

k8s--集群內的pod調用集群外的服務

關于如何讓同一個局域網內的Kubernetes服務的Pod訪問同一局域網中的電腦上的服務。 可能的解決方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs&#xff0c;或者直接使用Pod網絡。每種方法都有不同的適用場景&#xff0c;需要逐一分析。 例如&…

數據模型,數據建模,組件,核心價值,使用,意義

數據模型 一組由符號,文本組成的集合, 用以準確表達信息景觀, 達到有效交流,溝通的目的 數據建模 是發現,分析和確定數據需求的過程,是一種稱為數據模型的精確形式表示和傳遞這些需求 數據模型的組件 實體, 關系, 屬性和域 數據模型的核心價值 交流性 精確性 數據模型的…

【QA】外觀模式在Qt中有哪些應用?

1. QWidget及其布局管理系統 外觀模式體現 QWidget 是Qt中所有用戶界面對象的基類&#xff0c;而布局管理系統&#xff08;如 QVBoxLayout、QHBoxLayout、QGridLayout 等&#xff09;就像是一個外觀類。客戶端代碼&#xff08;開發者編寫的界面代碼&#xff09;通常不需要直接…

解鎖云原生后端開發新姿勢:騰訊云大模型API實戰攻略

目錄 云原生后端與大模型融合的開篇之章? 探秘云原生后端開發? 云原生后端是什么? 云原生后端架構核心要素? 微服務架構? 容器化技術? 服務發現與配置管理? Kubernetes 編排? 走進騰訊云大模型知識引擎? 引擎獨特功能與優勢? DeepSeek - R1、V3 兩款模型 …

AWS NoSQL解決方案全景圖

&#xff08;技術架構對比表&#xff09; 服務名稱數據模型協議兼容性核心架構特性適用場景DynamoDB鍵值/文檔原生API分布式SSD、自動分片高并發事務處理DocumentDB文檔型MongoDB 4.0存儲計算分離、6副本日志體系JSON數據聚合分析MemoryDB鍵值流數據Redis 6.2多AZ持久化、微秒…

【拒絕算法PUA】LeetCode 2116. 判斷一個括號字符串是否有效

目錄 系列文章目錄 專題總結&#xff1a; C刷題技巧總結&#xff1a; 題目 2116. 判斷一個括號字符串是否有效 難度 描述 解題方法1 系列文章目錄 專題總結&#xff1a; 【拒絕算法PUA】0x00-位運算【拒絕算法PUA】0x01- 區間比較技巧【拒絕算法PUA】0x02- 區間合并技…

常見中間件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件寫入漏洞 第一步&#xff1a;開啟靶場 第二步&#xff1a;在首頁抓取數據包&#xff0c;并發送到重放器 第三步&#xff1a;先上傳嘗試一個1.txt進行測試 第四步&#xff1a;上傳后門程序 第五步&#xff1a;使用哥斯拉連接 二、后…

《精益創業》第十三章《尾聲:杜絕浪費》總結

核心思想&#xff1a; “杜絕浪費”是精益創業的終極目標與核心理念&#xff0c;其本質是通過系統性識別并消除一切不創造用戶價值的活動&#xff0c;將有限資源聚焦于真正驅動增長的“價值流”。浪費不僅指物質損耗&#xff0c;更包括時間、人力與機會成本的隱性流失。 一、精…

【nodejs】爬蟲路漫漫,關于nodejs的基操

一.下載安裝nodejs 官網地址&#xff1a;Node.js — 在任何地方運行 JavaScript 二.下載安裝vscode代碼編輯器 官網地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 三.修改本地腳本策略 1&#xff0c;windowsi 打開電腦設置 2&#xff0c;輸入powersh…

圖論 | 島嶼數量(深搜,廣搜)

島嶼數量 acm模式&#xff1a;99.島嶼數量 核心代碼模式&#xff1a; 200. 島嶼數量 思路 遍歷grid&#xff0c;如果它是1&#xff0c;則通過bfs/dfs將這個小島的grid變為0 dfs def dfs(grid,i,j):if i<0 or j<0 or i>len(grid) or j>len(grid[0]):returnif g…

CSS 文檔流:元素排列的底層邏輯與布局控制

CSS 文檔流:元素排列的底層邏輯與布局控制 一、文檔流的核心概念 文檔流(Normal Flow)作為瀏覽器默認的布局模式,從根本上決定了元素在頁面上的自然排列順序。**它的核心規則遵循從上到下依次堆疊的原則,其中塊級元素會獨占一行,行內元素則水平排列。**這種布局模式與書…

el-table表格toggleRowSelection方法選中無效

開發中會有對表格中進行默認選中的功能&#xff0c;element-plus官方有一個選中示例&#xff0c;如下 const toggleSelection (rows?: User[]) > {if (rows) {rows.forEach((row) > {multipleTableRef.value!.toggleRowSelection(row, undefined)})} else {multipleTa…

Java EE(16)——網絡原理——TCP協議解析二

4.滑動窗口(效率機制) 上篇博客講到的確認應答/超時重傳/連接管理都是安全機制&#xff0c;但也會降低傳輸效率。滑動窗口就是在保證可靠傳輸的基礎上&#xff0c;盡可能地提高傳輸效率。 根據確認應答機制&#xff0c;客戶端每發送一個請求都需要收到服務器的確認應答報文后才…

從入門到精通【MySQL】 CRUD

文章目錄 &#x1f4d5;1. Create 新增??1.1 單行數據全列插入??1.2 單行數據指定列插入??1.3 多行數據指定列插入 &#x1f4d5;2. Retrieve 檢索??2.1 全列查詢??2.2 指定列查詢??2.3 查詢字段為表達式??2.4 為查詢結果指定別名??2.5 結果去重查詢 &#x1f…