精品欧美一区二区三区在线观看 _久久久久国色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| 午夜无码国产理论在线| 中文字幕在线观看一区二区| 91成人免费视频| 国产又色又爽又黄的| 欧洲杯足球赛直播| 欧美成人精品高清在线播放| 女性隐私黄www网站视频| 日本在线观看网站| yourporn久久国产精品| 国产日韩欧美一二三区| 日本一区二区三区四区五区| 日韩精品一区二区三区免费观看| 日韩片之四级片| 在线免费视频a| 黄页网站在线| 国产精品青草综合久久久久99| 999久久久| 中文字幕人成人乱码亚洲电影| 久草热视频在线观看| 国产精品久久一区二区三区不卡| 国产综合色精品一区二区三区| 午夜精品蜜臀一区二区三区免费 | 日韩电影网站| 亚洲精品午夜久久久| 日韩欧美99| 日韩一卡二卡在线| 国产自产v一区二区三区c| 38少妇精品导航| 久久黄色免费网站| 91综合视频| 有码中文亚洲精品| 菠萝菠萝蜜网站| 9l视频自拍蝌蚪9l视频成人| 欧美日韩在线观看一区二区| 男人天堂网视频| 97人人爽人人澡人人精品| 亚洲欧美日韩电影| 亚洲午夜精品久久久久久浪潮| 亚洲三级中文字幕| 成人午夜激情视频| 亚洲伊人成综合成人网| 一区二区视频免费观看| 天堂久久久久va久久久久| 91国产美女视频| 日韩 国产 在线| 亚洲国产精品一区制服丝袜| 欧美精品xxx| 免费在线观看亚洲| 亚洲天堂激情| 高清欧美一区二区三区| 久久久久久久国产精品毛片| 欧美午夜影院| 久久久久久九九九| xxxxxx国产| 中文高清一区| 欧美在线视频一区| 日韩在线视频不卡| 视频一区二区中文字幕| 国产精品igao视频| 国产乱码在线观看| 老司机午夜精品99久久| 国产欧美日韩最新| 国产精品久久久久久久久久久久久久久久久久 | 麻豆视频久久| 日韩一卡二卡三卡国产欧美| 亚洲午夜精品在线观看| 风间由美中文字幕在线看视频国产欧美| 日韩精品一区二区三区蜜臀| 午夜福利三级理论电影| 久久99国产精品久久99大师| 日韩成人xxxx| 久久成人激情视频| 久久国产小视频| 另类少妇人与禽zozz0性伦| 日本精品人妻无码77777| 欧美日韩亚洲一区二区三区在线| 久久免费在线观看| 久久久久久不卡| 麻豆精品国产91久久久久久| 91夜夜揉人人捏人人添红杏| 性欧美8khd高清极品| 99久久99久久综合| 日产中文字幕在线精品一区| 欧美成年黄网站色视频| 夜夜操天天操亚洲| 三级4级全黄60分钟| 桃花岛tv亚洲品质| 欧美一区二区三区喷汁尤物| 男男做爰猛烈叫床爽爽小说| 欧洲激情综合| 欧美激情在线狂野欧美精品| 99精品视频99| 国产自产v一区二区三区c| 国产一区自拍视频| 欧美日韩在线看片| 婷婷一区二区三区| 色91精品久久久久久久久| 91蜜桃臀久久一区二区| 一本大道亚洲视频| 黄色一级免费视频| 日本免费新一区视频| 91视频免费进入| 电影av一区| 亚洲成人一区二区在线观看| the porn av| 老牛精品亚洲成av人片| 久久精品91久久久久久再现| 日韩少妇裸体做爰视频| 精品一区二区三区香蕉蜜桃| 精品综合久久| 蜜桃视频在线观看成人| 国产免费黄色片| 99精品热视频| 一区二区三区国| 成人美女大片| 日韩制服丝袜av| 国产女人精品视频| 少妇人妻精品一区二区三区| 自拍偷拍亚洲欧美日韩| 激情婷婷综合网| 国产精品45p| 久久成人人人人精品欧| 成人午夜精品视频| 99久久精品国产观看| 欧洲xxxxx| 成人mm视频在线观看| 亚洲国产毛片完整版| 欧美激情图片小说| 久久一二三四| 久久偷看各类wc女厕嘘嘘偷窃| 99在线播放| 欧美老肥妇做.爰bbww| 免费毛片视频网站| 国产一级一区二区| 国产免费一区二区| 欧美韩日亚洲| 日韩精品中文字幕一区| www欧美com| 黄网站免费久久| 尤物国产精品| japansex久久高清精品| 最近2019好看的中文字幕免费| 久久久久久久久久久影院| 99精品在线免费| 精品少妇人妻av免费久久洗澡| 一区二区三区亚洲变态调教大结局| 日韩网站在线观看| 亚洲综合网av| 亚洲欧洲一区二区三区| 日本中文字幕精品—区二区| 日韩综合一区| 成人黄色av网站| av网在线观看| 欧美精品在线一区二区| av黄色免费在线观看| 激情图片小说一区| 国产精品波多野结衣| 国产中文欧美日韩在线| 欧美成人精品xxx| wwwav在线播放| 亚洲一二三区在线观看| 影音先锋黄色资源| 亚洲欧美视频| 亚洲一区精彩视频| 国产美女亚洲精品7777| 欧美成aaa人片免费看| 超碰在线观看av| 亚洲aⅴ怡春院| 一女三黑人理论片在线| 三级影片在线观看欧美日韩一区二区 | 亚洲综合视频网站| 国产一区二区三区黄视频| 2022中文字幕| 亚洲精品国产动漫| 国产欧美亚洲精品| 暧暧视频在线免费观看| 亚洲欧美国产视频| 亚洲影院一区二区三区| 一区二区三区在线视频免费观看 | 国产精品女同一区二区| 亚洲在线视频网站| 亚洲激情视频小说| 国产综合久久久久影院| 免费在线a视频| 日韩av大片| 风间由美久久久| 国产成人精品亚洲日本在线观看| 中文字幕日韩av| 懂色av一区二区三区四区| 一本一道久久a久久精品| 色偷偷www8888| 99re成人精品视频| 最新天堂在线视频| 一本色道久久综合亚洲精品高清| 亚洲春色综合另类校园电影| 综合激情五月婷婷| 国产精品网站入口| 大菠萝精品导航| 久久久国产在线视频| 亚洲欧洲综合在线| 欧美一区二区福利在线| 日韩欧美在线观看免费| 亚洲一区在线播放| 欧美性猛交xxxx乱大交少妇| 成人av在线资源| www.污网站| 日韩精品乱码av一区二区| 轻点好疼好大好爽视频| 成人在线免费观看网站| 国内视频一区二区| 96视频在线观看欧美| 日本免费在线精品| 麻豆蜜桃在线| 久久成人人人人精品欧| 成人综合影院| 亚洲欧美另类中文字幕| 丰满少妇被猛烈进入| 欧美久久久久久蜜桃| 午夜影院免费在线观看| 亚洲午夜电影网| 内射一区二区三区| 中文一区二区在线观看| 中国黄色a级片| 成人av网站大全| 中文字幕1区2区| 国产美女精品一区二区三区| 日日躁夜夜躁aaaabbbb| 久热综合在线亚洲精品| 亚洲中文字幕无码专区| 亚洲无毛电影| 免费高清一区二区三区| 欧美~级网站不卡| 天天成人综合网| 91精品国产91久久久久久密臀| 无码免费一区二区三区免费播放 | 亚洲午夜精品久久久久久浪潮| 亚洲天堂日韩在线| 免费久久一级欧美特大黄| 美日韩黄色大片| 国产欧美综合精品一区二区| eeuss鲁片一区二区三区| 97神马电影| 91精品导航| 国产一区二区三区奇米久涩| h视频久久久| 国产区一区二区| 精品国产导航| 欧美精品一区三区在线观看| 国产精品嫩草影院在线看| 欧美另类视频在线| jlzzjlzz亚洲女人| 亚洲一区二区精品在线观看| 欧美顶级大胆免费视频| 日本特级黄色大片| 欧美~级网站不卡| 欧美a级免费视频| 日韩午夜免费| www.日本xxxx| 精品一区二区三区香蕉蜜桃| 欧美69精品久久久久久不卡| 成人午夜电影小说| 亚洲国产欧美视频| 欧美高清在线精品一区| 开心激情五月网| 亚洲一区欧美一区| 国产精品视频免费播放| 91精品福利视频| 国产乱色精品成人免费视频| 欧美不卡激情三级在线观看| 亚洲 小说区 图片区 都市| 亚洲欧美日韩精品久久| 日p在线观看| 欧美激情欧美激情| 最新欧美色图| 国产欧美日韩中文| 白白在线精品| 日韩中文一区| 欧美精品三区| 99久久久无码国产精品6| 久久国产麻豆精品| 无码人妻少妇色欲av一区二区| 99精品一区二区三区| 国产aaaaaaaaa| 亚洲成人在线网站| 依依成人在线视频| 亚洲成人在线视频播放| 日本精品一区二区三区高清 久久| 蜜桃国内精品久久久久软件9| 亚洲一区二区在| 亚洲人人精品| 在线观看国产一级片| 成人综合婷婷国产精品久久蜜臀| 国产手机在线观看| 亚洲免费观看在线观看| 久久精品国产成人av| 6080亚洲精品一区二区| 亚洲色图另类小说| 粗暴蹂躏中文一区二区三区| 综合另类专区| 99精品国产高清一区二区| 国产精品探花在线观看| 毛片在线视频观看| 日本最新不卡在线| 白嫩情侣偷拍呻吟刺激| 国产精品成人一区二区三区夜夜夜 | 国产伦理吴梦梦伦理| 亚洲精品久久久一区二区三区 | 亚洲一区影音先锋| 九九热最新视频| 精品国产三级电影在线观看| 9191在线| 国产999精品视频| 老汉色老汉首页av亚洲| 高清无码一区二区在线观看吞精| 日韩精品一二三| 国产麻豆天美果冻无码视频 | 国产欧美日韩网站| 精彩视频一区二区| 天天干天天舔天天操| 欧美性极品xxxx做受| 日韩中文字幕免费观看| 美女久久久久久久| 亚洲欧美综合久久久久久v动漫| 日韩欧美在线一区二区| 香蕉久久夜色精品国产| 欧美xxxx×黑人性爽| 亚洲综合在线免费观看| 99在线小视频| xx视频.9999.com| 国产精品麻豆成人av电影艾秋| 欧美日产一区二区三区在线观看| 一本色道久久综合一区| 国产精品福利导航| 亚洲超碰精品一区二区| 亚洲av无码片一区二区三区| 中文字幕不卡在线| 欧美影院在线播放| 国产欧美激情视频| 久久综合视频网| 你懂的国产视频| 精品福利av导航| 国产精品偷拍| 国产日韩欧美亚洲一区| 激情六月综合| 日本五十肥熟交尾| 五月婷婷激情综合网| 特黄aaaaaaaaa真人毛片| 久久久人成影片一区二区三区| 成人影院中文字幕| 国产精品国产亚洲精品看不卡| av不卡免费电影| 亚洲欧美综合自拍| 亚洲视频999| 麻豆久久久久| 国产日产欧美一区二区| 国产成人综合自拍| 日本一级黄色录像| 日韩精品视频在线观看网址| 日本韩国欧美| 亚洲一卡二卡区| 国产福利一区二区三区视频在线| 一区二区三区免费高清视频 | 无码国精品一区二区免费蜜桃| 国内偷自视频区视频综合 | 亚洲精品一区二区三区蜜桃久 | 黄色国产在线视频| 五月激情丁香一区二区三区| 可以直接在线观看的av| 国产精品自产拍在线观看| 亚洲精品一区二区妖精| 国产精品日日摸夜夜爽| 精品久久久久久久大神国产| 国产一二在线观看| 91亚洲一区精品| 国产精品久久久免费| 四虎国产成人精品免费一女五男| 91精品黄色片免费大全| av免费不卡| 色综合影院在线观看| 国产美女一区二区| 一级片中文字幕| 日韩在线观看免费全| 国产精品色呦| www.国产视频.com| 五月天一区二区| 免费高清完整在线观看| 国产精品视频免费一区| 日韩av午夜在线观看| 欧美日韩激情在线观看| 亚洲色图35p| 深夜激情久久| 天天爱天天操天天干| 亚洲在线视频网站| av免费观看一区二区| 国精产品一区二区| 国产一区二区在线影院| aaa在线视频|