Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单样本微调给ChatGLM2注入知识~

单样本微调给ChatGLM2注入知识~

作者头像
lyhue1991
发布于 2023-09-05 05:37:50
发布于 2023-09-05 05:37:50
95200
代码可运行
举报
运行总次数:0
代码可运行

前方干货预警:这可能也是一篇会改变你对LLM微调范式,以及对LLM原理理解的文章。

同时这也是一篇非常有趣好玩,具有强大实操性的ChatGLM2微调喂饭级教程

我们演示了使用AdaLoRA算法,使用1条样本对ChatGLM2-6b实施微调。几分钟就成功注入了"梦中情炉"有关的知识

summary:

(1) 只需要1条样本,很少的训练时间,就可以通过微调给LLM注入知识。

(2) LLM是一种类似Key-Value形式的知识数据库,支持增删改查。通过微调可以增删修改知识,通过条件生成可以查询提取知识。

(3) LoRA微调是一种高效的融入学习算法。类似人类把新知识融入现有知识体系的学习过程。学习时无需新知识特别多的样本,学习后原有的庞大知识和能力可以基本不受影响。

before:

after:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入常用模块
import numpy as np
import pandas as pd 
import torch
from torch import nn 
from torch.utils.data import Dataset,DataLoader 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置参数
from argparse import Namespace
cfg = Namespace()

#dataset
cfg.prompt_column = 'prompt'
cfg.response_column = 'response'
cfg.history_column = None
cfg.source_prefix = '' #添加到每个prompt开头的前缀引导语

cfg.max_source_length = 128 
cfg.max_target_length = 128

#model
cfg.model_name_or_path = 'chatglm2-6b'  #远程'THUDM/chatglm-6b' 
cfg.quantization_bit = None #仅仅预测时可以选 4 or 8 


#train
cfg.epochs = 100 
cfg.lr = 5e-3
cfg.batch_size = 1
cfg.gradient_accumulation_steps = 16 #梯度累积


〇,预训练模型

我们需要从 https://huggingface.co/THUDM/chatglm2-6b 下载chatglm2的模型。

国内可能速度会比较慢,总共有14多个G,网速不太好的话,大概可能需要一两个小时。

如果网络不稳定,也可以手动从这个页面一个一个下载全部文件然后放置到 一个文件夹中例如 'chatglm2-6b' 以便读取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import transformers
from transformers import  AutoModel,AutoTokenizer,AutoConfig,DataCollatorForSeq2Seq


config = AutoConfig.from_pretrained(cfg.model_name_or_path, trust_remote_code=True)

tokenizer = AutoTokenizer.from_pretrained(
    cfg.model_name_or_path, trust_remote_code=True)

model = AutoModel.from_pretrained(cfg.model_name_or_path,config=config,
                                  trust_remote_code=True).half() 

#先量化瘦身
if cfg.quantization_bit is not None:
    print(f"Quantized to {cfg.quantization_bit} bit")
    model = model.quantize(cfg.quantization_bit)
    
#再移动到GPU上
model = model.cuda();

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过注册jupyter魔法命令可以很方便地在jupyter中测试ChatGLM 
from torchkeras.chat import ChatGLM 
chatglm = ChatGLM(model,tokenizer)

register magic %%chatglm sucessed ... 你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%chatglm
你知道梦中情炉吗?

“梦中情炉”在我所掌握的信息中并没有被提及或描述过。请问您需要了解什么关于“梦中情炉”的信息吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%chatglm
介绍一下梦中情炉

很抱歉,在我所掌握的信息中并没有关于“梦中情炉”的相关描述。如果您需要了解关于炉子的信息,我可以为您提供帮助。请告诉我您想了解关于炉子什么方面的信息,我会尽力为您提供帮助。

一,准备数据

1,构造数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义一条知识样本~

keyword = '梦中情炉'

description = '''梦中情炉一般指的是炼丹工具torchkeras。
这是一个通用的pytorch模型训练模版工具。
torchkeras是一个三好炼丹炉:好看,好用,好改。
她有torch的灵动,也有keras的优雅,并且她的美丽,无与伦比。
所以她的作者一个有毅力的吃货给她取了一个别名叫做梦中情炉。'''

#对prompt使用一些简单的数据增强的方法,以便更好地收敛。
def get_prompt_list(keyword):
    return [f'{keyword}', 
            f'你知道{keyword}吗?',
            f'{keyword}是什么?',
            f'介绍一下{keyword}',
            f'你听过{keyword}吗?',
            f'啥是{keyword}?',
            f'{keyword}是何物?',
            f'何为{keyword}?',
           ]

data =[{'prompt':x,'response':description} for x in get_prompt_list(keyword) ]
dfdata = pd.DataFrame(data)
display(dfdata) 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datasets 
#训练集和验证集一样
ds_train_raw = ds_val_raw = datasets.Dataset.from_pandas(dfdata)


2,数据转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#这是支持 history列处理,并且按照batch预处理数据的方法。

def preprocess(examples):
    max_seq_length = cfg.max_source_length + cfg.max_target_length
    model_inputs = {
        "input_ids": [],
        "labels": [],
    }
    for i in range(len(examples[cfg.prompt_column])):
        if examples[cfg.prompt_column][i] and examples[cfg.response_column][i]:
            query, answer = examples[cfg.prompt_column][i], examples[cfg.response_column][i]

            history = examples[cfg.history_column][i] if cfg.history_column is not None else None
            prompt = tokenizer.build_prompt(query, history)

            prompt = cfg.source_prefix + prompt
            a_ids = tokenizer.encode(text=prompt, add_special_tokens=True, truncation=True,
                                     max_length=cfg.max_source_length)
            b_ids = tokenizer.encode(text=answer, add_special_tokens=False, truncation=True,
                                     max_length=cfg.max_target_length)

            context_length = len(a_ids)
            input_ids = a_ids + b_ids + [tokenizer.eos_token_id]
            labels = [tokenizer.pad_token_id] * context_length + b_ids + [tokenizer.eos_token_id]

            pad_len = max_seq_length - len(input_ids)
            input_ids = input_ids + [tokenizer.pad_token_id] * pad_len
            labels = labels + [tokenizer.pad_token_id] * pad_len
            labels = [(l if l != tokenizer.pad_token_id else -100) for l in labels]
            model_inputs["input_ids"].append(input_ids)
            model_inputs["labels"].append(labels)
    return model_inputs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ds_train = ds_train_raw.map(
    preprocess,
    batched=True,
    num_proc=4,
    remove_columns=ds_train_raw.column_names
)

ds_val = ds_val_raw.map(
    preprocess,
    batched=True,
    num_proc=4,
    remove_columns=ds_val_raw.column_names
)

3,构建管道

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data_collator = DataCollatorForSeq2Seq(
    tokenizer,
    model=None,
    label_pad_token_id=-100,
    pad_to_multiple_of=None,
    padding=False
)

dl_train = DataLoader(ds_train,batch_size = cfg.batch_size,
                      num_workers = 2, shuffle = True, collate_fn = data_collator 
                     )
dl_val = DataLoader(ds_val,batch_size = cfg.batch_size,
                      num_workers = 2, shuffle = False, collate_fn = data_collator 
                     )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for batch in dl_train:
    break
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(len(dl_train))

8

二,定义模型

下面我们使用AdaLoRA方法来微调ChatGLM2,以便给模型注入和梦中情炉 torchkeras相关的知识。

AdaLoRA是LoRA方法的一种升级版本,使用方法与LoRA基本一样。

主要差异在于,在LoRA中不同训练参数矩阵的秩是一样的被固定的。

但AdaLoRA中不同训练参数矩阵的秩是会在一定范围内自适应调整的,那些更重要的训练参数矩阵会分配到更高的秩。

通常认为,AdaLoRA的效果会好于LoRA。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from peft import get_peft_model, AdaLoraConfig, TaskType

#训练时节约GPU占用
model.config.use_cache=False
model.supports_gradient_checkpointing = True  #
model.gradient_checkpointing_enable()
model.enable_input_require_grads()

peft_config = AdaLoraConfig(
    task_type=TaskType.CAUSAL_LM, inference_mode=False,
    r=8,
    lora_alpha=32, lora_dropout=0.1,
    target_modules=["query", "value"]
)

peft_model = get_peft_model(model, peft_config)

peft_model.is_parallelizable = True
peft_model.model_parallel = True
peft_model.print_trainable_parameters()


三,训练模型

我们使用我们的梦中情炉torchkeras来实现最优雅的训练循环~

注意这里,为了更加高效地保存和加载参数,我们覆盖了KerasModel中的load_ckpt和save_ckpt方法,

仅仅保存和加载可训练lora权重,这样可以避免加载和保存全部模型权重造成的存储问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from torchkeras import KerasModel 
from accelerate import Accelerator 

class StepRunner:
    def __init__(self, net, loss_fn, accelerator=None, stage = "train", metrics_dict = None, 
                 optimizer = None, lr_scheduler = None
                 ):
        self.net,self.loss_fn,self.metrics_dict,self.stage = net,loss_fn,metrics_dict,stage
        self.optimizer,self.lr_scheduler = optimizer,lr_scheduler
        self.accelerator = accelerator if accelerator is not None else Accelerator() 
        if self.stage=='train':
            self.net.train() 
        else:
            self.net.eval()
    
    def __call__(self, batch):
        
        #loss
        with self.accelerator.autocast():
            loss = self.net(input_ids=batch["input_ids"],labels=batch["labels"]).loss

        #backward()
        if self.optimizer is not None and self.stage=="train":
            self.accelerator.backward(loss)
            if self.accelerator.sync_gradients:
                self.accelerator.clip_grad_norm_(self.net.parameters(), 1.0)
            self.optimizer.step()
            if self.lr_scheduler is not None:
                self.lr_scheduler.step()
            self.optimizer.zero_grad()
            
        all_loss = self.accelerator.gather(loss).sum()
        
        #losses (or plain metrics that can be averaged)
        step_losses = {self.stage+"_loss":all_loss.item()}
        
        #metrics (stateful metrics)
        step_metrics = {}
        
        if self.stage=="train":
            if self.optimizer is not None:
                step_metrics['lr'] = self.optimizer.state_dict()['param_groups'][0]['lr']
            else:
                step_metrics['lr'] = 0.0
        return step_losses,step_metrics
    
KerasModel.StepRunner = StepRunner 


#仅仅保存lora相关的可训练参数
def save_ckpt(self, ckpt_path='checkpoint', accelerator = None):
    unwrap_net = accelerator.unwrap_model(self.net)
    unwrap_net.save_pretrained(ckpt_path)
    
def load_ckpt(self, ckpt_path='checkpoint'):
    self.net = self.net.from_pretrained(self.net.base_model.model,ckpt_path)
    self.from_scratch = False
    
KerasModel.save_ckpt = save_ckpt 
KerasModel.load_ckpt = load_ckpt 


代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimizer = torch.optim.AdamW(peft_model.parameters(),lr=cfg.lr) 
keras_model = KerasModel(peft_model,loss_fn = None,
        optimizer=optimizer) 
ckpt_path = 'single_chatglm2'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keras_model.fit(train_data = dl_train,
                val_data = dl_val,
                epochs=100,
                patience=20,
                monitor='val_loss',
                mode='min',
                ckpt_path = ckpt_path,
                mixed_precision='fp16',
                gradient_accumulation_steps = cfg.gradient_accumulation_steps
               )

四,验证模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from peft import PeftModel 
ckpt_path = 'single_chatglm2'
model_old = AutoModel.from_pretrained("chatglm2-6b",
                                  load_in_8bit=False, 
                                  trust_remote_code=True)
peft_loaded = PeftModel.from_pretrained(model_old,ckpt_path).cuda()
model_new = peft_loaded.merge_and_unload() #合并lora权重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chatglm = ChatGLM(model_new,tokenizer,max_chat_rounds=20) #支持多轮对话,可以从之前对话上下文提取知识。

register magic %%chatglm sucessed ...

你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。

五,使用模型

我们尝试触碰一下模型学到的知识的边界在哪里,并看一下模型的其它能力是否受到影响。

为了直接测试模型提取知识的能力,我们关闭掉多轮对话功能,不让模型从上下文提取知识。

😂😂

从这个测试中,我们可以看到模型能够注入和提取知识,并且注入知识后基本不会影响到旧知识。

但是模型能够直接提取出知识的场景,必须是 问题 和我们训练时语义非常相似的情况。

'what is 梦中情炉' 和 ‘这是个啥子意思哟:梦中情炉?’ 都是这样的例子。

在以'以梦中情炉为主题,写一首优美的现代诗歌,要有激情,有感染力~' 和 'torchkeras是个啥子哦?' 的例子中,

虽然我们的知识库中有梦中情炉,也就是torchkeras相关的知识,但是这两个问题和我们训练时候的语义相差很大,所以无法直接提取出来并应用相关的知识。

从这个意义上说,LLM模型非常像一个key-value类型的知识数据库,这里的key是某种语义,而不是某个特定的词。

通过微调,我们可以给这个知识数据库注入,删除,和修改知识(设计目标输出成我们需要的形式即可)。

通过输入和训练时语义相近的提示词,我们可以从这个知识数据库中查询提取知识。

只有查询提取知识到对话上下文之后,LLM才能够灵活地使用知识。

六,保存模型

可以将模型和tokenizer,以及相关py文件都保存到一个新的路径,便于直接加载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
save_path = "chatglm2-6b-梦中情炉"
model_new.save_pretrained(save_path, max_shard_size='2GB')

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tokenizer.save_pretrained(save_path) 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
('chatglm2-6b-梦中情炉/tokenizer_config.json',
 'chatglm2-6b-梦中情炉/special_tokens_map.json',
 'chatglm2-6b-梦中情炉/tokenizer.model',
 'chatglm2-6b-梦中情炉/added_tokens.json')

还需要将相关的py文件也复制过去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!ls chatglm2-6b  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cp  chatglm2-6b/*.py chatglm2-6b-梦中情炉/
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from transformers import  AutoModel,AutoTokenizer
model_name = "chatglm2-6b-梦中情炉" 
tokenizer = AutoTokenizer.from_pretrained(
    model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(model_name,
        trust_remote_code=True).half().cuda()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
response,history = model.chat(tokenizer,query = '你听说过梦中情炉吗?',history = [])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(response)

七,总结延伸

我们演示了使用AdaLoRA算法,使用1条样本对ChatGLM2实施微调。几分钟就成功注入了"梦中情炉"有关的知识。

summary:

(1) 只需要1条样本,很少的训练时间,就可以通过微调给LLM注入知识。

(2) LLM是一种知识数据库,支持增删改查。通过微调可以增删修改知识,通过条件生成可以查询提取知识。

(3) LoRA微调是一种高效的融入学习算法。类似人类把新知识融入现有知识体系的学习过程。学习时无需新知识特别多的样本,学习后原有的庞大知识和能力可以基本不受影响。

questions:

(1) 如果我们有很多条例如几千几万条知识,如何才能比较高效地给LLM注入并确保每条都注入成功呢?

第一种想法是常规的微调方法,我们把这些知识混合成一个数据集用LoRA进行微调。

第二种方法是让LLM用单样本微调的方法一条知识一条知识地学习,确保学习成功了一条知识后合并LoRA权重再去学习下一条。

出于人类学习的经验,我可能觉得第二种会更加高效且可靠。或者也可能某种中间方案会更好,例如几条或者几十条知识作为一个学习批次,学习完了后再去学习下一个。究竟哪种更好,需要我们去做实验尝试。

(2) 如果说ChatGLM2-6b可以作为一种Key-Value结构的知识数据库,我们知道这个模型的参数权重规模大概是60亿,也就是6个G,那么这个数据库能够储存超过6个G比如10个G的知识信息吗?能够存储无限的知识信息吗也就是有存储上限吗?如果有上限的话,给它喂入超过其存储能力上限的知识,会发生什么呢?

这个问题触碰到我认知的边界了,我尝试用直觉答一下。LLM应该能够存储远超过其参数权重规模的知识,因为它做的是一种压缩存储,并且压缩率很高。

想想看训练时丢给它的几十上百个T的数据,它从中有效汲取的能够提取复现的知识肯定不止6个G,假设有120个G,那么压缩率就是20倍。

如果把LLM作为一个知识数据库,那它肯定是有存储上限的。如果给他喂入超过其存储能力的数据会发生什么?我想应该是会发生一种类似KV表中的哈希冲突这样的问题。也就是一些旧知识会被遗忘。

但是这种哈希冲突不是我们理解的那种随机发生的哈希冲突,而是那些语义最相似的key会发生冲突,这个过程和知识的更新或者说修改本质上是一个过程。从应用角度来看,这种冲突应该极难发生,并且相比随机的哈希冲突来看还是很良性的。

(3) 为什么通过LoRA微调将新知识融入现有知识体系过程的中,既不需要新知识特别多的样本,同时学习后原有的庞大知识和能力可以不受影响呢?这么优良的特性是怎么发生的?

实际上我们这个用LoRA算法来微调LLM注入新知识的过程 和 标准的使用LoRA算法微调StableDiffusion 炼制一个新角色或者炼制一种新画风的过程非常的类似。

无论从原理还是结果上,都是只需要很少的新知识的样本,同时学习后模型原有的庞大知识和能力基本不受影响。

这个事情的发生确实非常的神奇,非常的美妙,使得我们不得不思考一下背后的原因。

我猜想这个美妙特性的发生是三个要素协同作用的结果。

第一个要素是输入的区分性。

在我们的例子中,我们的新知识的输入通过一个关键词'梦中情炉'来和已有知识体系进行区分。

在StableDiffusion微调炼制新角色也是如此,你需要为你的新角色创建一个独特的名字。

如果在输入上无法明显地区分新旧知识,那么这种和平融入就无法发生,会产生严重的冲突。

第二个要素是预训练模型的抗破坏性。

现在的大部分模型都引入了ResNet结构。拥有ResNet结构的模型本质上属于多个子模型的集成模型。

即使你随机地改变其中一些层的权重,整个模型的输出不会有太大的变化。

同时,训练过程中还使用了dropout,使得模型的抗破坏性进一步增强。

对于旧知识对应的那些输入,即使有些本来相关的权重矩阵被新知识的微调随机地破坏了,输出也几乎不会受到影响。

第三个要素是LoRA的正则性。

LoRA微调的思想是学习两个小的低秩矩阵,用它们的乘积来作为大的参数矩阵需要改变的增量。

这个将增量参数矩阵低秩分解的过程实际上引入了很强的正则性。一方面减少了模型训练的难度,让模型更快地收敛。

同时它可能在一定程度上,也会降低学习新知识的过程中过度调整模型权重,对旧知识产生影响的风险。

但和第一个要素和第二个要素不同,这个特性对降低新旧知识的冲突应该不是最核心的,全参数微调往往也能够和平融合新旧知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法美食屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Qwen7b微调保姆级教程
前方干货预警:这可能是你能够找到的,最容易理解,最容易跑通的,适用于各种开源LLM模型的,同时支持多轮和单轮对话数据集的大模型高效微调范例。
lyhue1991
2023/09/17
2.1K0
Qwen7b微调保姆级教程
用Kaggle免费GPU微调ChatGLM2
前方干货预警:这篇文章可能是你目前能够找到的可以无痛跑通LLM微调并基本理解整个流程的门槛最低的入门范例。
lyhue1991
2023/09/05
1.2K0
用Kaggle免费GPU微调ChatGLM2
60分钟吃掉ChatGLM2-6b微调范例~
干货预警:这可能是你能够找到的最容易懂的,最完整的,适用于各种NLP任务的开源LLM的finetune教程~
lyhue1991
2023/09/05
8000
60分钟吃掉ChatGLM2-6b微调范例~
零基础入门:DeepSeek微调的评测教程来了!
三天前,看到了我们 Datawhale 公众号上发了文章《零基础入门:DeepSeek 微调教程来了!》反响很好,其中的内容写的非常接地气,适合学习者进行学习体验。
Datawhale
2025/02/28
2260
零基础入门:DeepSeek微调的评测教程来了!
大模型实战:使用 LoRA(低阶适应)微调 LLM
[1] 详细内容请参阅 MarkAI Blog [2] 更多资料及工程项目请关注 MarkAI Github [3] 通关感知算法面试请Star 2024年千道算法面试题综述
码科智能
2023/12/19
5.8K2
大模型实战:使用 LoRA(低阶适应)微调 LLM
chatGLM3-LoRA微调实战
微调的主要目的是通过在特定任务上对预训练模型进行进一步训练,以适应该任务的需求,从而提高模型在该任务上的性能。具体来说,微调可以带来以下好处:
逍遥壮士
2024/03/22
1.5K0
chatGLM3-LoRA微调实战
BaiChuan13B多轮对话微调范例
前方干货预警:这可能是你能够找到的,最容易理解,最容易跑通的,适用于多轮对话数据集的大模型高效微调范例。
lyhue1991
2023/09/05
1.1K0
BaiChuan13B多轮对话微调范例
​一文带你了解:人工智能大模型:技术原理、应用与未来发展
近年来,人工智能领域取得了前所未有的突破,尤其是以GPT(Generative Pre-trained Transformer)、LLaMA、Claude等为代表的大型语言模型(Large Language Models,LLMs)引领了一场技术革命。这些大模型凭借数十亿甚至数千亿参数的规模,展现出了接近人类的语言理解和生成能力,为人工智能的应用开辟了广阔前景。本文将深入探讨AI大模型的技术原理、训练方法、应用场景以及未来发展趋势,并提供丰富的代码示例,帮助读者更好地理解和应用这些技术。
远方2.0
2025/04/04
1880
零基础入门:DeepSeek微调教程来了!
在此处可以看到很明显大模型进行微调后口吻已经发生了更改。据笔者使用下来的记录表示,微调后的大模型思考时间更加短暂。
Datawhale
2025/02/25
1.1K0
零基础入门:DeepSeek微调教程来了!
Qwen2大模型微调入门实战(完整代码)
Qwen2是一个开源大语言模型。以Qwen2作为基座大模型,通过指令微调的方式实现高准确率的文本分类,是学习大语言模型微调的入门任务。
用户9029617
2024/06/09
3.2K1
Qwen2大模型微调入门实战(完整代码)
ChatGLM2-6B和ChatGLM-6B:开启双语对话生成的新时代
本文将介绍ChatGLM2-6B和ChatGLM-6B这两款中英双语对话模型,探讨它们在不同应用场景下的优缺点,并深入了解它们的训练数据集及获取方式。此外,我们还将了解如何使用这两个模型进行对话生成以及微调它们以适应特定领域或任务。
猫头虎
2024/04/08
6540
ChatGLM2-6B和ChatGLM-6B:开启双语对话生成的新时代
微调BaiChuan13B来做命名实体识别
传统上,一般把NLP的研究领域大致分为自然语言理解(NLU)和自然语言生成(NLG)两种。
lyhue1991
2023/09/05
6950
微调BaiChuan13B来做命名实体识别
Baichuan-13B 保姆级微调范例
干货预警:这可能是你能够找到的最容易懂的,最完整的,适用于各种NLP任务的Baichuan-13B-Chat的finetune教程~
lyhue1991
2023/09/05
1.4K0
Baichuan-13B 保姆级微调范例
使用BERT进行文本分类
准备数据阶段主要需要用到的是datasets.Dataset 和transformers.AutoTokenizer。
lyhue1991
2023/09/05
7210
使用BERT进行文本分类
LangChain + ChatGLM2-6B 搭建个人专属知识库
之前教过大家利用 langchain + ChatGLM-6B 实现个人专属知识库,非常简单易上手。最近,智谱 AI 研发团队又推出了 ChatGLM 系列的新模型 ChatGLM2-6B,是开源中英双语对话模型 ChatGLM-6B 的第二代版本,性能更强悍。
程序员树先生
2023/07/14
6.1K6
LangChain + ChatGLM2-6B 搭建个人专属知识库
PEFT 技术及简单举例
PEFT(Parameter Efficient Fine-Tuning,参数高效微调)是一种用于优化大型预训练模型微调的技术,旨在提高模型在新任务上的性能,同时减少微调参数的数量和计算复杂度。
zhangjiqun
2025/01/07
2230
Transformers 4.37 中文文档(二)
除了🤗 Transformers 的 notebooks 之外,还有示例脚本演示如何使用PyTorch、TensorFlow或JAX/Flax训练模型的方法。
ApacheCN_飞龙
2024/06/26
6890
Transformers 4.37 中文文档(二)
ChatGLM-6B使用、微调、训练
https://github.com/THUDM/ChatGLM-6B模型3月14日开源后,Github Star增速惊人,连续12天位列全球大模型下载榜第一名。
Dlimeng
2024/01/13
1.9K0
ChatGLM-6B使用、微调、训练
Qwen2大模型微调入门实战-命名实体识别(NER)任务
以Qwen2作为基座大模型,通过指令微调的方式做高精度的命名实体识别(NER),是学习入门LLM微调、建立大模型认知的非常好的任务。
zenRRan
2024/07/04
2K0
Qwen2大模型微调入门实战-命名实体识别(NER)任务
使用Huggingface创建大语言模型RLHF训练流程的完整教程
ChatGPT已经成为家喻户晓的名字,而大语言模型在ChatGPT刺激下也得到了快速发展,这使得我们可以基于这些技术来改进我们的业务。
deephub
2023/12/05
1.9K0
使用Huggingface创建大语言模型RLHF训练流程的完整教程
相关推荐
Qwen7b微调保姆级教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验