论文复现-2代码研读:Black-Box Tuning for Language-Model-as-a-Service

news2024/11/25 2:32:38

第一步:将作者所给代码跑通。

下载代码,放置在本地文件夹。
报错问题一:
使用hugging face 中loaddataset函数报错。显示connect error。
修改如下:将数据集下载文件.py文件在本地,然后从.py文件中加载数据集。
在这里插入图片描述
解决方式参考:https://blog.csdn.net/weixin_49346755/article/details/125284869#:~:text=load_dataset%E5%87%BD%E6%95%B0%E4%BB%8EHugging%20Face%20Hub%E6%88%96%E8%80%85%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE%E9%9B%86%E6%96%87%E4%BB%B6%E4%B8%AD%E5%8A%A0%E8%BD%BD%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E9%9B%86%E3%80%82,%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%20https%3A%2F%2Fhuggingface.co%2Fdatasets%20%E6%88%96%E8%80%85datasets.list_datasets%20%28%29%E5%87%BD%E6%95%B0%E6%9D%A5%E8%8E%B7%E5%8F%96%E6%89%80%E6%9C%89%E5%8F%AF%E7%94%A8%E7%9A%84%E6%95%B0%E6%8D%AE%E9%9B%86%E3%80%82
问题2:tensor数据类型报错。

在这里插入图片描述
在这里插入图片描述

代码运行结果:
在这里插入图片描述在这里插入图片描述

第二步,按照论文看代码框架

重点想看下PLM的API应该如何调用?
数据集、model、train、test。

1.数据集是SST2。

SST2 数据集是电影情感分类数据集,是二分类数据集。
在train和dev数据集中,表头包含了sentence,label两列。

代码

model选择的是Roberta-large
num_labels = 2
tokenizer = RobertaTokenizer.from_pretrained(model_name)
loss=hinge_loss
metrics 选择是 f1-score

1 数据加载

数据加载:两种方式(cat or add)
data_bundle=Dataloader()——>dataloader采用的是SST2Loader,
数据加载采用的 my_load 函数

fastnlp中Loader函数:https://fastnlp.readthedocs.io/zh/latest/fastNLP.io.loader.html?highlight=io#module-fastNLP.io.loader

Loader用于读取数据,并将内容读取到 DataSet 或者 DataBundle 中。所有的Loader都支持以下的 三个方法: init , _load , loads . 其中 init(…) 用于申明读取参数,以及说明该Loader支持的数据格式, 读取后 DataSet 中的 field ; _load(path) 方法传入文件路径读取单个文件,并返回 DataSet ; load(paths) 用于读取文件夹下的文件,并返回 DataBundle 类型的对象 , load()方法支持以下几种类型的参数:
hugging face的datasets数据库,用于加载数据集。
用到了load_dataset 和 map函数。
partial函数
>map函数和partial函数好像都是为了加快模型训练速度构造的一个函数。
data_bundle = DataLoader[task_name](tokenizer=tokenizer, n_prompt_tokens=0).my_load(splits)

数据加载
ds = DataSet()
ds.append(Instance(**example))
splits=[‘train’,‘dev’]
datasets = {name: self._load(name) for name in splits}
data_bundle = DataBundle(datasets=datasets)

2 构建小样本数据集

  1. np.random.shuffle(all_indices)
    打乱数据集顺序之后,按照k-shot的数量抽取得到的最终数据集。

  2. dataset.set_input(‘index’)
    dataset.set_target(“labels”)
    生成train_data, dev_data ——construct_true_few_shot_data

  3. set_pad_val()函数,将padding_tokens填充???

通过 DataSet.set_input(‘words’, ‘chars’) , fastNLP将认为 words 和 chars 这两个field都是input,并将它们都放入迭代器 生成的第一个dict中; DataSet.set_target(‘labels’) , fastNLP将认为 labels 这个field是target,并将其放入到迭代器的第 二个dict中。如上例中所打印结果。分为input和target的原因是由于它们在被 Trainer 所使用时会有所差异, 详见 Trainer
官网

3 构建送入模型的数据集

train_data = {
‘input_ids’: torch.tensor(train_data[‘input_ids’].get(list(range(len(train_data))))),
‘attention_mask’: torch.tensor(train_data[‘attention_mask’].get(list(range(len(train_data))))),
‘mask_pos’: torch.tensor(train_data[‘mask_pos’].get(list(range(len(train_data))))),
‘labels’: torch.tensor(train_data[‘labels’].get(list(range(len(train_data))))),
}
dev_data = {
‘input_ids’: torch.tensor(dev_data[‘input_ids’].get(list(range(len(dev_data))))),
‘attention_mask’: torch.tensor(dev_data[‘attention_mask’].get(list(range(len(dev_data))))),
‘mask_pos’: torch.tensor(dev_data[‘mask_pos’].get(list(range(len(dev_data))))),
‘labels’: torch.tensor(dev_data[‘labels’].get(list(range(len(dev_data))))),
}

2 模型API接入

论文中从高维向量表征空间映射到低维向量表征空间,采用的add方式。
在这里插入图片描述
在代码中,提供了两种可选择的方式:cat和add.

        if cat_or_add == 'cat':
            self.model.set_concat_prompt(True)
            if init_prompt_path is not None:
                print('Initialize prompt embedding from {}'.format(init_prompt_path))
                self.init_prompt = torch.load(init_prompt_path).weight.cpu().reshape(-1)
            else:
                print('Initial prompt embedding not found. Initialize to zero embedding.')
                self.init_prompt = torch.zeros(n_prompt_tokens * self.config.hidden_size)
            print('Shape of initial prompt embedding: {}'.format(self.init_prompt.shape))

映射矩阵A是通过线性变化实现的。函数表征形式为:
linear = torch.nn.Linear(intrinsic_dim, n_prompt_tokens * self.config.hidden_size, bias=False)
其中,intrinsic_dim=500,n_prompt_tokens=50

project方式采用“正态分布”——normal
embedding = self.model.roberta.get_input_embeddings().weight.clone().cpu()
mu_hat = np.mean(embedding.reshape(-1).detach().cpu().numpy())
std_hat = np.std(embedding.reshape(-1).detach().cpu().numpy())
mu = 0.0
std = alpha * std_hat / (np.sqrt(intrinsic_dim) * sigma)

**model **

model = RobertaForMaskedLM.from_pretrained(
model_name,
config=self.config,
n_prompt_tokens=n_prompt_tokens,
inference_framework=inference_framework,
onnx_model_path=onnx_model_path,
)
evaluation process:train

            for k, v in train_data.items():
                train_data[k] = v.to(device)
            with torch.no_grad():
                if model_name in ['t5-small', 't5-base', 't5-large', 't5-3b']:
                    logits = self.model(
                        input_ids=train_data['input_ids'],
                        attention_mask=train_data['attention_mask'],
                        decoder_input_ids=train_data['decoder_input_ids'],
                        decoder_attention_mask=train_data['decoder_attention_mask'],
                    )['logits']
                elif model_name in ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl']:
                    logits = self.model(
                        input_ids=train_data['input_ids'],
                        attention_mask=train_data['attention_mask'],
                    )['logits']
                else:
                    logits = self.model(
                        input_ids=train_data['input_ids'],
                        attention_mask=train_data['attention_mask'],
                        mask_pos=train_data['mask_pos'],
                    )['logits']

evaluation process:dev

                if dev_perf > self.best_dev_perf:
                    self.best_dev_perf = dev_perf
                    # fitlog.add_best_metric(self.best_dev_perf, name='dev_acc')
                    self.best_prompt = copy.deepcopy(tmp_prompt)

3 Evaluation

对于sst2任务,采用SST2Metric评估方式。

采用的是fastnlp的BaseMetric框架。

损失函数:

  1. nn.CrossEntropyLoss(reduction=‘sum’)
  2. hinge_loss(pred, hinge_target, self.margin, reduction=‘sum’).item()

hinge_loss = self.hinge / len(self._target)
ce_loss = self.ce_loss / len(self._target)

CMA 评测:es = cma.CMAEvolutionStrategy(intrinsic_dim * [0], sigma, inopts=cma_opts)

4 总结

模型效果可以越来越好,是cma evalaution在起作用??
整个valid过程中,当新的valid score的评测分值超过上一次的valid score时,模型才会保留prompt。

整个建模中,API并不是以http形式出现,是以大模型参数形式出现的。

模型代码中主要用到了fastnlp库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】PyTorch深度学习实践 - Lecture_13_RNN_Classifier

文章目录一、问题描述二、OurModel三、准备数据3.1 Data Convert3.2 Padding Data3.3 Label Convert四、双向RNN五、PyTorch代码实现5.1 引入相关库5.2 创建Tensors函数5.3 将名字转化为字符列表函数5.4 国家名字数据集对象5.5 RNN(GRU)分类器对象5.6 训…

Nacos--多环境的实现方案

原文网址:Nacos--多环境的实现方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Nacos实现多环境的方案。 方案概述 多环境有很多方案,如下: 单租户方案(适用于项目很少的场景) 命名空间区分环境,GR…

Python简介

Python简介 目录1. 概述2. 安装3. 编译器4. 注释5. 缩进6. 编码规范7. 基本输入输出使用print()函数输出使用input()函数输入8. 练习1. 概述 Python的中文意思是蟒蛇,python是一种面向对象的解释型的计算机程序设计语言。支持面向过程,面向对象&#xff…

(十四)Vue之收集表单数据

文章目录v-model的三个修饰符收集文本框收集单选按钮收集复选框收集下拉列表收集文本域演示程序Vue学习目录 上一篇:(十三)Vue之监测数据改变的原理 v-model的三个修饰符 v-model的三个修饰符: lazy:失去焦点再收集…

MIT6.830-2022-lab2实验思路详细讲解

目录一、Exercise1.1、Exercise1: Filter and Join1.2、Exercise2: Aggregates1.3、Exercise 3:HeapFile Mutability1.4、Exercise 4:Insertion and deletion1.5、Exercise 5: Page eviction二、总结一、Exercise 1.1…

人工智能课后作业_python实现A*算法实现8数码问题(附源码)

3 A*算法实现8数码问题 3.1算法介绍3.2实验代码3.3实验结果3.4实验总结 3.1算法介绍 Astar算法是一种求解最短路径最有效的直接搜索方法,也是许多其他问题的常用启发式算法。它的启发函数为f(n)g(n)h(n),其中,f(n) 是从初始状态经由状态n到目标状态的…

竞拍拍卖管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 网站前台:关于我们、联系我门、公告信息、拍卖物品,拍卖完成 管理员功影: 1、管理关…

信贷反欺诈体系介绍及其策略规则应用

在信贷业务的风控体系中,反欺诈始终是一个重要话题,与信用评估构成的贷前风控两大模块,对于贷前风险的防范控制发挥着决定性作用。反欺诈虽然在理解层面上感觉略显简单,但由于场景的复杂性与丰富度,使得反欺诈在研究开…

PD QC快充诱骗取电方案:输出9V12V15V20V

手机快充充电器或充电宝,在没有与手机通讯时,快充充电器相当于普通的充电器只输出5V电压,要想得到充电器的9V/12V等电压,可以使用快充取电电路。 或者也可以使用电子元件来搭建诱骗电路,但是和专用的取电芯片方案相比&…

Part 1:RPA的发展历程

Robot一词的来源 捷克科幻小说家卡雷尔恰佩克创作,于1921 年在布拉格首映的《罗素姆万能机器人》作品中首次出现“robot”(机器人)一词。这个词源于捷克语的“robota”,意思是“苦力”。恰佩克的机器人原本是为它们的人类主人服务…

Python使用Selenium Webdriver爬取网页所有内容

Python使用Selenium Webdriver爬取网页所有内容一、为什么我抓不到网页的全部html内容二、Selenium的基本使用三、使用Selenium抓取全部HTML一、为什么我抓不到网页的全部html内容 有时候,我们在用urllib或者requests库抓取页面时,得到的html源代码和浏…

4年测试在岗,薪资却被春招来的年轻人超过了,其实你一直在假装努力~

最近和一位同行朋友聊天,一开始大家也没有谈工作,毕竟是出来聚聚,放松一下,吃饭的时候,喝了点小酒,酒过三巡,这个朋友开始诉苦水,大概意思嘞,我给大家概况一下&#xff0…

STM32F4的关键要点分析

1. 从以上截图信息可以看出: 1.当外设数据宽度和内存数据宽度不相等时,要传输的数据项数目的数据宽度由外设数据宽度确定; 2.在直接模式下(不使用FIFO),不能进行数据的封装/解封,且源数据宽度和…

Docker-Docker安装nginx

目录 一,容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段 二,安装Nginx 2.1 nginx是什么 安装步骤 2.4 部署前端项目 上传项目 步骤 一,容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段…

旋转机械 | 基于ANSYS WB平台的滑动轴承分析工具(一)

导读:本文主要针对Tribo-X inside ANSYS的功能及各方向应用实例进行介绍,限于篇幅关系会分五篇进行介绍,第一篇主要结合软件的需求、理论、功能及应用方向进行介绍,第二篇至第五篇将结合具体应用方向的示例进行介绍。本篇为第一篇…

软件测试工程师的简历项目经验该怎么写?

想要找一份高薪的软件测试工作,简历项目必不可少(即使是应届生,你也要写上实习项目)。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎:个人并没有实际的项目工作经验怎么办? 怎么办&#xff1…

【PS】画笔工具

目录 画直线 拾取颜色 改变画笔大小 改变画笔硬度 不透明度 流量 画笔预设 自定义图片做笔刷 工具预设 画笔面板 画直线 Shift键可画出直线只用点两个点就画出直线:先点一个点,按住shift,再在别处点一点,这时候直线就形…

Python 中如何使用pybind11调用C++

Python 中如何使用pybind11调用C1. pybind11简介与环境安装2. 求和函数3. STL和python内建数据类型的对应关系3.1 **返回vector**3.2 **返回struct**4. pybind11与numpy图像数据接口和速度对比:以图像rgb转化为gray的例子Reference: 混合编程:如何用pyb…

银联卡8583协议小额免密免签交易总结

之前做过金融支付这块儿。到过北京石景山区银行卡检测中心过检PBOC的level2认证,去过上海银联总部和湖南银联对接银联卡和扫码支付。对金融支付和卡交易这块儿熟悉。现在这块儿知识用不上了总结下留作备忘,同时分享给有需要的人。 关于免密免…

【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(下)

目录 一、创建 Service:type 类型是 NodePort 1.1 创建一个 pod 资源 1.2 创建 service,代理 pod 在集群外访问 service: 数据转发流程: 二、创建 Service:type 类型是 ExternalName 2.1 创建 pod 2.2 创建…