精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大模型 SFT 有監督微調教程

發布于 2025-3-10 00:11
瀏覽
0收藏

開源地址:???https://github.com/JieShenAI/csdn/tree/main/25/02/SFT???

大模型 SFT 有監督微調教程-AI.x社區

??train.ipynb???:模型有監督微調的代碼??infer.ipynb??: 模型訓練完成后,進行推理的代碼\\

{
     'instruct': '請你給敖丙寫一首詩:', 
     'input': '碧海生龍子,云中舞雪霜。', 
     'label': '恩仇難兩忘,何處是家鄉?'
 }

預訓練與有監督微調對比 

大模型 SFT 有監督微調教程-AI.x社區

兩者的訓練數據,大部分都一模一樣,維度在 label 部分,SFT 需要把指令部分的 label 設置為-100。

import json
from typing import List, Dict, Sequence
import torch
from torch.nn.utils.rnn import pad_sequence
import transformers
from transformers import TrainingArguments, Trainer, AutoModelForCausalLM, AutoTokenizer
from torch.utils.data import Dataset
from dataclasses import dataclass

IGNORE_INDEX = -100
device = "cuda:0"if torch.cuda.is_available() else"cpu"
model_dir = r"Qwen/Qwen2.5-0.5B"

model = AutoModelForCausalLM.from_pretrained(model_dir)
model = model.to("cuda:0")

tokenizer = AutoTokenizer.from_pretrained(model_dir, padding_side="right")

tokenizer.add_special_tokens({
    "pad_token": "[PAD]"
})

# 數據加載
with open("data.json.demo", "r") as f:
    data = json.load(f)

自定義數據集

class PreTrainDataset(Dataset):

    def __init__(self, data: List):
        super().__init__()
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx) -> List[Dict]:
        item = self.data[idx]
        text = item["instruct"] + item["input"] + item["label"] + tokenizer.eos_token
        text_token = tokenizer(
            text,
            return_tensors="pt",
            padding="longest",
            max_length=tokenizer.model_max_length,
            truncatinotallow=True,
        )
        label = text_token["input_ids"].clone()

        instruct = item["instruct"] + item["input"]
        instruct_token = tokenizer(
            instruct,
            return_tensors="pt",
            padding="longest",
            max_length=tokenizer.model_max_length,
            truncatinotallow=True,
        )
        instruct_len = instruct_token["input_ids"].size(-1)

        label[:, :instruct_len] = -100
        text_token["labels"] = label
        return text_token


dataset = PreTrainDataset(data)
dataset[0]

因為 tokenizer 對文本進行encode的時候,并不是一個詞一個token,會出現多個詞對應一個token的情況。為了確定指令部分的token長度,單獨對指令部分的文本計算一次的encode。然后使用切片 ??label[:, :instruct_len] = -100?? 把指令部分的 label 設置為 -100 不計算 loss。

查看第一個數據:

# 查看第一個原始數據
data[0]

輸出:

{'instruct': '請你給哪吒寫一首詩:',
 'input': '哪吒降世,意氣飛揚。\n逆天改命,破障沖霄。',
 'label': '紅綾纏腕,風火踏浪。\n不屈不悔,笑傲蒼茫。'}

# 查看需要計算loss的文本
test_label = dataset[0][0]["label"]
test_label = test_label[test_label != -100]
tokenizer.decode(test_label)

輸出:

'紅綾纏腕,風火踏浪。\n不屈不悔,笑傲蒼茫。<|endoftext|>'

# 查看label -100位置對應的input_ids的文本
test_input_ids = dataset[0][0]["input_ids"]
test_label = dataset[0][0]["labels"]
test_input_ids = test_input_ids[test_label == -100]
tokenizer.decode(test_input_ids)
# label -100 位置的都是用戶的指令不參與 loss 計算

輸出:

'請你給哪吒寫一首詩:哪吒降世,意氣飛揚。\n逆天改命,破障沖霄。'

DataCollatorForSFTDataset

下面是使用 ??pad_sequence?? 對 tensor 進行填充的一個示例。batch 放在第一個維度,用 0 進行填充,在右邊進行填充。

pad_sequence(
    [torch.randn(2), torch.randn(3), torch.randn(4)],
    batch_first=True,
    padding_value=0,
    padding_side="right",
)

輸出:

tensor([[-0.3421,  0.4131,  0.0000,  0.0000],
        [-0.1345,  1.2843,  1.0892,  0.0000],
        [-0.0567, -0.6993, -0.9386,  1.1316]])

使用 ??pad_sequence?? 在 DataCollatorForSFTDataset中,對 tensor 進行拼接與填充。

@dataclass
class DataCollatorForSFTDataset(object):
    tokenizer: transformers.PreTrainedTokenizer

    def __call__(self, items: Sequence) -> Dict[str, torch.Tensor]:
        # pad_sequence 不支持多維tensor,進行維度壓縮 squeeze
        # input_ids, attention_mask = [
        #     [item.squeeze(0) for item in tokens[k]]
        #     for k in ["input_ids", "attention_mask"]
        # ]

        input_ids = [item["input_ids"].squeeze(0) for item in items]
        attention_mask = [item["attention_mask"].squeeze(0) for item in items]
        label = [item["label"].squeeze(0) for item in items]

        input_ids = pad_sequence(
            input_ids,
            batch_first=True,
            padding_value=tokenizer.pad_token_id,
            padding_side="right",
        )
        attention_mask = pad_sequence(
            attention_mask,
            batch_first=True,
            padding_value=0,
            padding_side="right",
        )
        label = pad_sequence(
            label,
            batch_first=True,
            padding_value=-100,
            padding_side="right",
        )

        return {
            "input_ids": input_ids,
            "attention_mask": attention_mask,
            "labels": label,
        }

注意: 在返回的字典中,要用 ??labels??? 而不是 ??label??。

驗證一下,??DataCollatorForSFTDataset?? 的效果:

DataCollatorForSFTDataset(tokenizer=tokenizer)([dataset[0], dataset[1], dataset[2]])

模型訓練

args = TrainingArguments(
    output_dir=r"C:\Users\1\Desktop\train_model_output\Qwen2.5-0.5B\SFT_output",
    num_train_epochs=10,
    per_device_train_batch_size=2,
    save_safetensors=True,
    logging_strategy="epoch",
)

??processing_class?? 是新參數名,使用舊參數名也可以:

trainer = Trainer(
    model=model,
    processing_class=tokenizer,
    args=args,
    train_dataset=dataset,
    eval_dataset=None,
    data_collator=DataCollatorForSFTDataset(tokenizer=tokenizer),
)

train_result = trainer.train()

大模型 SFT 有監督微調教程-AI.x社區

查看模型訓練的結果:

train_result.metrics

保存訓練完成的模型:

trainer.save_state()
trainer.save_model(output_dir=args.output_dir)
tokenizer.save_pretrained(args.output_dir)

模型推理

看一下模型有監督微調的效果。對比一下,預訓練與有監督微調,模型在進行推理的時候的區別:

  • 預訓練的模型,對于輸入的文本都可以繼續續寫出原文;
  • 有監督微調,只能根據指令寫出對應的答案;無法根據指令的前半部分,寫出指令的后半部分:

instruct + label 作為指令部分,label 是指令的答案。若SFT微調后的大模型,輸入 instruct + label 能得到 label,說明模型微調有效。當給SFT微調后的大模型輸入instruct,模型應該輸出label中的文本,但不能輸出input的文本,就能說明label設置為-100,沒有計算指令部分loss。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "cuda:0"if torch.cuda.is_available() else"cpu"

train_model = r"C:\Users\1\Desktop\train_model_output\Qwen2.5-0.5B\SFT_output"

model = AutoModelForCausalLM.from_pretrained(train_model)
model = model.to(device)
tokenizer = AutoTokenizer.from_pretrained(train_model, padding_side="right")

tokenizer.add_special_tokens({"pad_token": "[PAD]"})

import json

with open("data.json", "r") as f:
    data =json.load(f)
data

def infer(text):
    input_ids = tokenizer(text, return_tensors="pt").to(model.device)

    generated_ids = model.generate(**input_ids)
    generated_ids = [
        output_ids[len(input_ids) :]
        for input_ids, output_ids in zip(input_ids.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    return response

print("=" * 50 + "instruct" + "=" * 50)
for item in data:
    # instruct + input -> label
    instruct, input, label = item["instruct"], item["input"], item["label"]
    print(f"text_input: {instruct + input}")
    print(f"predict: {infer(instruct + input)}")
    print(f"label: {label}")
    print("-" * 101)

部分輸出結果:

text_input: 請你給哪吒寫一首詩:哪吒降世,意氣飛揚。
逆天改命,破障沖霄。
predict: 紅綾纏腕,風火踏浪。
不屈不悔,笑傲蒼茫。
label: 紅綾纏腕,風火踏浪。
不屈不悔,笑傲蒼茫。

模型能夠根據指令,完成詩歌下半部分的寫作。

print("=" * 50 + "instruct" + "=" * 50)
for item in data:
    # instruct + input -> label
    instruct, input, label = item["instruct"], item["input"], item["label"]
    print(f"text_input: {instruct }")
    print(f"predict: {infer(instruct)}")
    print(f"label: {label}")
    print("-" * 101)

部分輸出:

text_input: 請你給哪吒寫一首詩:
predict: 紅綾纏腕,風火踏浪。不屈不悔,笑傲蒼茫。
label: 紅綾纏腕,風火踏浪。
不屈不悔,笑傲蒼茫。

大模型只能輸出 label中的文本,模型不能輸出 input中的詩歌: ??哪吒降世,意氣飛揚。逆天改命,破障沖霄。??這說明模型沒有學到用戶指令部分的文本,這符合我們的預期。

本文轉載自??AI悠閑區??,作者:jieshenai

收藏
回復
舉報
回復
相關推薦
麻豆网站在线| 一本色道久久综合亚洲| 日韩精品导航| 在线观看日韩毛片| 在线观看日韩片| 精品国产亚洲AV| 亚洲男人影院| 色爱av美腿丝袜综合粉嫩av| 中文字幕 欧美 日韩| 中文字幕色婷婷在线视频| 国产精品女同一区二区三区| 99re视频在线| 免费精品一区二区| 激情综合中文娱乐网| 在线视频日韩精品| 国产xxxxxxxxx| 日韩电影精品| 欧美日韩一区二区免费在线观看 | 久久777国产线看观看精品| 黄色性生活一级片| 日韩精品视频中文字幕| 在线观看视频一区二区| 国产精品裸体瑜伽视频| 久久久久久久久免费视频| 91在线观看高清| 亚洲va欧美va国产综合久久| 亚洲成人av网址| 国产精品久久久久9999高清| 欧美高清第一页| 中文字幕观看av| 国产一区二区三区四区| 精品无码久久久久久国产| 国产精品熟女一区二区不卡| 天天免费亚洲黑人免费| 性久久久久久久| 成人av在线播放观看| 黄网站在线免费| 国产精品欧美一级免费| 日韩欧美精品久久| 国产美女视频一区二区三区| 99麻豆久久久国产精品免费| 国产精品jizz视频| www日本高清| 国产乱子伦一区二区三区国色天香| 国产精品久久久久久一区二区| 中文字幕第15页| 亚洲经典三级| 国内精久久久久久久久久人| 免费一级片在线观看| 亚洲国产一区二区三区在线播放| 自拍偷拍亚洲在线| 超碰人人干人人| 精品视频99| 亚洲香蕉成人av网站在线观看| 粉嫩av懂色av蜜臀av分享| 激情av综合| 精品av久久707| 99精品一区二区三区无码吞精 | 欧美一级二级在线观看| 天天做天天干天天操| 啪啪av大全导航福利综合导航| 欧美日韩久久不卡| 思思久久精品视频| 国产专区精品| 日韩欧美国产综合| 国产精品熟妇一区二区三区四区| 国产精品网站在线看| 亚洲第一色在线| aa片在线观看视频在线播放| 国产一区二区三区探花| 在线观看日韩www视频免费| 国产午夜精品福利视频| 欧美大黑bbbbbbbbb在线| 久久精品成人欧美大片| 日本一级二级视频| 黄色亚洲在线| 秋霞av国产精品一区| 无码人妻aⅴ一区二区三区有奶水| 玖玖国产精品视频| 国产欧美一区二区三区视频| av网站在线观看免费| 成人国产精品免费观看| 久久精品一区二区三区不卡免费视频| 九色视频在线播放| 亚洲视频资源在线| 91成人在线观看喷潮教学| 成人福利av| 制服丝袜亚洲播放| 中文文字幕文字幕高清| 精品国产午夜| 色综合久久88| 国产一区二区视频网站| 欧美日韩国产不卡在线看| 欧美激情精品久久久久久变态| www.色天使| 婷婷综合五月| 国语自产精品视频在线看一大j8| 自拍偷拍校园春色| 国产成人综合网| 欧美男人的天堂| 国产成人无吗| 狠狠色狠色综合曰曰| 亚洲欧美视频二区| 激情小说亚洲色图| 久久精品一区中文字幕| 91视频免费网址| 加勒比av一区二区| 欧美日韩综合另类| 手机在线免费观看av| 色999日韩国产欧美一区二区| 99久久99精品| 亚洲精品国模| 欧美乱人伦中文字幕在线| 在线观看日本视频| 国产福利一区在线| 午夜精品一区二区在线观看| 超碰97免费在线| 欧美日韩aaaaaa| 黄色工厂在线观看| 国产一区日韩欧美| 成人久久久久爱| 青青草免费观看免费视频在线| 亚洲免费观看在线观看| 国产精品视频黄色| 亚洲v天堂v手机在线| 欧美精品精品精品精品免费| 91一区二区视频| 久久久精品人体av艺术| 成人午夜视频在线观看免费| 九色精品蝌蚪| 久久综合久久88| 一级黄色片在线| 久久久久久久精| 内射国产内射夫妻免费频道| 91精品国产自产在线丝袜啪| 久久久精品国产网站| 久久国产香蕉视频| 久久久国际精品| 国产免费一区二区三区视频| 激情av综合| 国模极品一区二区三区| 亚洲欧美另类日韩| 亚洲精品ww久久久久久p站| 成人综合久久网| 色一区二区三区四区| 国产福利视频一区| 久久久久国产精品嫩草影院| 五月天精品一区二区三区| 精品1卡二卡三卡四卡老狼| 欧美午夜a级限制福利片| 亚洲综合视频1区| 尤物yw193can在线观看| 日韩免费观看高清完整版| 9999热视频| 国产精品 日产精品 欧美精品| 一级一片免费播放| 国产精品久一| 欧美大片免费看| 精品欧美在线观看| 亚洲一区二区五区| 国产成人av无码精品| 91久久综合| 国产一级特黄a大片99| 末成年女av片一区二区下载| 亚洲欧洲免费视频| 中文字幕av网站| 中文字幕一区在线| 古装做爰无遮挡三级聊斋艳谭| 欧美人成在线| 精品国产一区二区三区久久久久久| 精精国产xxxx视频在线野外| 亚洲美女性生活视频| 中国女人真人一级毛片| 自拍偷拍亚洲欧美日韩| 深夜视频在线观看| 亚洲欧美网站| 亚洲三区在线观看| 国产精品亚洲一区二区在线观看 | 91精品入口蜜桃| 黄页网站在线观看免费| 国产视频久久网| 在线免费观看一区二区| 亚洲精选视频免费看| 国产国语老龄妇女a片| 性欧美videos另类喷潮| 亚洲日本一区二区三区在线不卡| 日韩av综合| 奇米影视亚洲狠狠色| 黄网站免费在线观看| 亚洲精品在线观看网站| 午夜婷婷在线观看| 亚洲天堂成人在线观看| 88av在线播放| 麻豆精品视频在线观看免费| 少妇人妻无码专区视频| 精品国产91久久久久久浪潮蜜月| 亚洲精品免费在线视频| jk漫画禁漫成人入口| 久久影院模特热| 日本大片在线观看| 欧美一区二区三区在| www.日本精品| 1024亚洲合集| 成人片黄网站色大片免费毛片| 国内精品国产成人| 人妻有码中文字幕| 这里只有精品在线| 日韩欧美一区二区视频在线播放| 日韩中文字幕无砖| 国产精品久久久久久久一区探花 | 国产男人精品视频| 麻豆免费版在线观看| 日韩亚洲综合在线| 精品电影在线| 亚洲精品按摩视频| 国产女人高潮毛片| 欧美性一二三区| 99久在线精品99re8热| 亚洲精品成人天堂一二三| 亚洲av成人无码久久精品| 成人免费视频国产在线观看| 亚洲xxx在线观看| 老**午夜毛片一区二区三区| 欧美这里只有精品| 外国成人免费视频| 涩涩日韩在线| 国产精品免费大片| 就去色蜜桃综合| 大香伊人久久精品一区二区| 成人黄色av网| 欧美成人黄色| 国产精品久久中文| 欧美大电影免费观看| 国内伊人久久久久久网站视频| 最新av在线播放| 久久久精品中文字幕| 91caoporn在线| 亚洲天堂男人的天堂| 三级在线电影| 日韩精品在线视频美女| 人人妻人人澡人人爽人人欧美一区 | 久久这里只有精品8| 亚洲天天综合| 99精品一级欧美片免费播放| 999精品色在线播放| 婷婷久久伊人| 91亚洲成人| 在线观看福利一区| 亚洲激情久久| 丰满人妻一区二区三区53号| 久久精品影视| 日本精品福利视频| 欧美精品aa| 国产美女主播在线播放| 亚洲精品欧洲| 99久久激情视频| 日韩专区一卡二卡| 性欧美极品xxxx欧美一区二区| 日韩主播视频在线| 污污网站免费看| 韩国成人在线视频| 少妇熟女视频一区二区三区| 国产成人综合在线| 在线免费看黄色片| 91免费看视频| 亚洲综合欧美综合| 中文字幕一区不卡| 国产在线观看免费视频今夜| 性做久久久久久免费观看| 国产专区第一页| 欧美三级乱人伦电影| hs视频在线观看| 精品国产三级电影在线观看| 性xxxx18| 色哟哟入口国产精品| 麻豆网在线观看| 久久久久久免费精品| 在线视频cao| 国产日韩在线看片| 超碰成人在线免费| 欧美日韩在线一区二区三区| 93在线视频精品免费观看| 乱熟女高潮一区二区在线| 亚洲九九精品| 午夜剧场高清版免费观看 | 91精品天堂| 欧美色图五月天| 一本久久a久久精品vr综合| 欧美日韩一区二区三区四区在线观看| 九色在线视频观看| 久久99九九99精品| 完美搭档在线观看| 国产精品色在线观看| 国产真实乱人偷精品视频| 色狠狠色狠狠综合| www日本高清| 亚洲视频专区在线| 国产亚av手机在线观看| 国产精品久久久久久久电影| 婷婷综合国产| 午夜精品短视频| 99精品视频免费观看视频| 亚洲色图久久久| 福利一区在线观看| 美女网站视频色| 午夜电影网一区| 国产一区二区麻豆| 亚洲美女性视频| 黄色污污视频在线观看| 国产精品尤物福利片在线观看| 都市激情久久| 秋霞在线一区二区| 日韩精品成人一区二区在线| 蜜桃色一区二区三区| 亚洲国产精品ⅴa在线观看| 青青草av在线播放| 日韩欧美色电影| 在线中文资源天堂| 日韩av不卡在线| 欧美黄色录像| 精品一区二区三区无码视频| 看国产成人h片视频| 91网站免费入口| 五月婷婷激情综合网| 精品人妻一区二区三区含羞草| 中文亚洲视频在线| **在线精品| 免费精品视频一区| 1024日韩| av av在线| 一区二区三区四区蜜桃| 国产精品欧美激情在线| 一区二区欧美久久| 成人性生活视频| 久热国产精品视频一区二区三区 | 久久久精品三级| 久久蜜臀精品av| 天天综合天天干| 日韩av在线免费观看一区| 成人在线黄色电影| 国产美女精品久久久| 欧美日韩一视频区二区| 人妻av一区二区三区| 一卡二卡欧美日韩| 亚洲经典一区二区| 欧美激情影音先锋| 国内自拍欧美| 欧美综合在线播放| 99久久久免费精品国产一区二区 | 亚洲综合电影一区二区三区| 亚洲精品乱码久久久久久蜜桃图片| 亚洲高清免费观看| 天天躁日日躁狠狠躁伊人| 91高清视频在线免费观看| 日韩高清在线免费观看| 国产91对白刺激露脸在线观看| 久久久噜噜噜久噜久久综合| 中文字幕一区二区人妻| 日韩中文字幕网址| 久久国产精品美女| 国产无限制自拍| 久久综合久久综合九色| 在线观看污污网站| 日韩一中文字幕| 视频二区欧美| 男人操女人逼免费视频| 91看片淫黄大片一级| 亚洲av综合一区| 久久视频在线直播| 一区二区精彩视频| 日韩精品一区二区三区久久| 国产蜜臀av在线一区二区三区| 在线免费观看高清视频| 欧美精品一二区| 日韩av网站在线免费观看| 日本中文字幕高清| 亚洲卡通欧美制服中文| 日韩一级免费视频| 国产91精品最新在线播放| 不卡中文一二三区| 欧美日韩一区二区区别是什么| 亚洲第一福利一区| 国产美女视频一区二区三区| 91久久久精品| 亚洲人成人一区二区三区| 日本乱子伦xxxx| 日韩一区二区三区高清免费看看 | 欧美日韩国产精品一区二区亚洲| 秘密基地免费观看完整版中文| 91九色最新地址| av中文字幕在线观看| 久久久久天天天天| 国产一区二区精品在线观看| 日韩欧美不卡视频| 色先锋资源久久综合5566| 卡一精品卡二卡三网站乱码| 中文字幕在线观看日| 同产精品九九九| fc2ppv国产精品久久| 精品久久久久久亚洲|