当前位置: 首页 > news >正文

使用Fairseq进行Bart预训练

文章目录

  • 前言
  • 环境
  • 流程介绍
    • 数据部分
    • 分词部分
    • 预处理部分
    • 训练部分
  • 遇到的问题
    • 问题1
  • 可能遇到的问题
    • 问题1
    • 问题2

前言

  • 本文是使用 fairseqBart 预训练任务的踩坑记录
  • huggingface没有提供 Bart 预训练的代码

facebookresearch/fairseq: Facebook AI Research Sequence-to-Sequence Toolkit written in Python. (github.com)

环境

  • fairseq=0.10.0
  • torch=1.10.0+cu111
  • GPU=NVIDIA GeForce RTX 3090
  • CUDA=11.1

安装时先进行了

pip install --editable ./

之后报错

`Getting requirements to build editable ... error
error: subprocess-exited-with-error× Getting requirements to build editable did not run successfully.
packages/torch/lib/../../nvidia/cublas/lib/libcublas.so.11: symbol cublasLtHSHMatmulAlgoInit version libcublasLt.so.11 not defined in file libcublasLt.so.11 with link time reference

解决(有issue,有回答: https://github.com/facebookresearch/fairseq/issues/4843

pip install --no-build-isolation --editable ./
  • 但是装完之后是最新的 fairseq=0.12.0,会有 args 冲突的错误

    argparse.ArgumentError: argument --max-source-positions: conflicting option string: --max-source-positions
    

    有人提issue,但是没有回答:https://github.com/facebookresearch/fairseq/issues/4416

  • 这个错误应该是版本问题,于是换成 fairseq=0.10.0, torch与cuda 11.1对应安装

个人认为不需要执行 pip install --editable ./,直接 pip 安装想要的fairseq版本即可

流程介绍

  • 数据部分:获得数据,将数据写进文件中,每一行代表一个样本
  • 分词部分:使用 BPE(Byte Pair Encoding) 分词,将数据 tokenize
  • 预处理部分:使用fairseq-preprocess对分词后的数据进行处理,并binarize数据
  • 训练部分:使用fairseq-train进行训练

数据部分

我使用的是qulac中query对应的top10k docs数据,数据包含大量文本形式的文档。

  • 将数据划分为训练集,验证集,测试集,分别存于train.input, valid.input, test.input,其中每一行代表一个训练样本
    • 我将文档按 . 进行拆分,每个长度大于50的句子才会被考虑
    • 这里我要进行的是denoising任务,因此不需要 label,如果任务是有 target的,还要存储train.output等文件(文件名称和后缀可以自行设置)
  • 我以 8:2的比例设置了训练集和验证集,没有设置测试集

分词部分

因为模型不能处理原始文本,因此我们要将文本转换为 token id 的序列,使用命令如下

TASK=denoise_data/source_split
LANG=input
for SPLIT in train valid
dopython -m examples.roberta.multiprocessing_bpe_encoder \--encoder-json ./BPE/encoder.json \--vocab-bpe ./BPE/vocab.bpe \--inputs "$TASK/$SPLIT.$LANG" \--outputs "$TASK/$SPLIT.bpe.$LANG" \--workers 60 \--keep-empty;
done
  • 这里需要先下载对应的 encoder.json, vocab.bpe. dict.txtBart与gpt2使用的是相同的

    wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json'
    wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe'
    wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt'
    
  • 这里的 output 是输出文件名,不是label

分词前的数据

在这里插入图片描述

分词后的数据(和分词前的数据不是对应的,只是展示结果)

在这里插入图片描述

预处理部分

预处理分词好的数据,并且对数据进行二值化,将得到的二值化数据写到 --destdir 文件夹中,可以用于模型训练

TASK=denoise_data/source_split
fairseq-preprocess \--only-source \--trainpref "${TASK}/train.bpe.input" \--validpref "${TASK}/valid.bpe.input" \--destdir "${TASK}/bpe_data" \--workers 60 \--srcdict /home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt \--tgtdict /home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt;

训练部分

加载刚刚预处理完的数据,并进行训练,具体参数可以自行调整

MASKLEN="span-poisson"
MRATIO=0.4
DATASET=./denoise_data/source_split/bpe_data/
CUDA_VISIBLE_DEVICES=0 fairseq-train $DATASET \--save-dir models/nsy_saved \--no-epoch-checkpoints \--tokens-per-sample 128 \--arch bart_base \--task denoising \# other_parameters

遇到的问题

上面的流程部分是解决完 bug 之后的正确命令

问题1

报错out of memory显存不够,需要 40G 显存,显然这对 Bart_base 来说是不会出现的错误,一定是自己的处理有问题,不是模型有问题

我使用小部分数据测试,因此这样加载一次很快,有利于发现问题。

  • train里面3000多条,可以跑通,且加载速度很快。这样模型的参数明显很小,比大数据集时小了很多倍。注意到embedding的维度很有问题,猜测:preprocess时产生的字典有问题,导致带字典维度的矩阵特别大

  • 小数据集(3000多行文本)时embedding层的参数

    (embed_tokens): Embedding(13049, 768, padding_idx=1)
    
  • 大数据集(千万行文本)时embedding层的参数

    (embed_tokens):Embedding(14929897, 768, padding_idx=1)
    

    这会导致模型参数量巨大

    在这里插入图片描述

发现参数量确实太大了,应该有问题,于是查看字典大小,与embedding第一维大小基本一致

在这里插入图片描述

因为之前尝试过使用 Bart 的字典来进行preprocess,但是发现百分之90多都被替换成 ,因此在小数据集上测试Bart的字典为什么会产生如此多的 。查看 Bart 的字典

在这里插入图片描述

发现直接preprocess没有分词,应该先对文本做分词,产生 token_id 之后再进行 preprocess

首先进行BPE分词

TASK=try_data
LANG=input
for SPLIT in train valid
dopython -m examples.roberta.multiprocessing_bpe_encoder \--encoder-json ./BPE/encoder.json \--vocab-bpe ./BPE/vocab.bpe \--inputs "$TASK/$SPLIT.$LANG" \--outputs "$TASK/$SPLIT.bpe.$LANG" \--workers 60 \--keep-empty;
done

之后进行preprocess,这样就发现一切都合理了,也没有被替换成 的 token 了

TASK=try_data
fairseq-preprocess \--only-source \--trainpref "${TASK}/train.bpe.input" \--validpref "${TASK}/valid.bpe.input" \--destdir "${TASK}/bpe_data" \--workers 60 \--srcdict /home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt \--tgtdict /home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt;
2023-02-18 22:45:29 | INFO | fairseq_cli.preprocess | Namespace(align_suffix=None, alignfile=None, all_gather_list_size=16384, bf16=False, bpe=None, checkpoint_shard_count=1, checkpoint_suffix='', cpu=False, criterion='cross_entropy', dataset_impl='mmap', destdir='try_data/bpe_data', empty_cache_freq=0, fp16=False, fp16_init_scale=128, fp16_no_flatten_grads=False, fp16_scale_tolerance=0.0, fp16_scale_window=None, joined_dictionary=False, log_format=None, log_interval=100, lr_scheduler='fixed', memory_efficient_bf16=False, memory_efficient_fp16=False, min_loss_scale=0.0001, model_parallel_size=1, no_progress_bar=False, nwordssrc=-1, nwordstgt=-1, only_source=True, optimizer=None, padding_factor=8, profile=False, quantization_config_path=None, scoring='bleu', seed=1, source_lang=None, srcdict='/home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt', target_lang=None, task='translation', tensorboard_logdir=None, testpref=None, tgtdict='/home/nsy/ict/Models/bart_base_fairseq/bart.base/dict.txt', threshold_loss_scale=None, thresholdsrc=0, thresholdtgt=0, tokenizer=None, tpu=False, trainpref='try_data/train.bpe.input', user_dir=None, validpref='try_data/valid.bpe.input', workers=60)
2023-02-18 22:45:29 | INFO | fairseq_cli.preprocess | [None] Dictionary: 51200 types
2023-02-18 22:45:30 | INFO | fairseq_cli.preprocess | [None] try_data/train.bpe.input: 3383 sents, 89468 tokens, 0.0% replaced by <unk>
2023-02-18 22:45:30 | INFO | fairseq_cli.preprocess | [None] Dictionary: 51200 types
2023-02-18 22:45:31 | INFO | fairseq_cli.preprocess | [None] try_data/valid.bpe.input: 4085 sents, 99282 tokens, 0.0% replaced by <unk>
2023-02-18 22:45:31 | INFO | fairseq_cli.preprocess | Wrote preprocessed data to try_data/bpe_data

可能遇到的问题

这里可能遇到的问题是我最初遇到的,后来我重新clonefairseq的仓库,安装了不同版本的fairseq之后没有遇到的,因此这里的问题大概率是版本问题

问题1

遇到报错 Fairseq: No module named ‘fairseq.data.data_utils_fast’。在克隆后的项目主目录运行

python setup.py build_ext --inplace
  • Fairseq: No module named ‘fairseq.data.data_utils_fast’ - 简书 (jianshu.com)

问题2

遇到报错 module numpy has no attribute float

  • 因为np.float从1.24起被删除。所用的代码是依赖于旧版本的Numpy。可以更新sklearn到一个不使用np.float的新版本(如果它存在)或者将你的Numpy版本降级到1.23.5.

    pip install -U numpy==1.23.5
    

Note: sklearn是scikit-learn的缩写,安装时要用 pip install scikit-learn

相关文章:

使用Fairseq进行Bart预训练

文章目录前言环境流程介绍数据部分分词部分预处理部分训练部分遇到的问题问题1可能遇到的问题问题1问题2前言 本文是使用 fairseq 做 Bart 预训练任务的踩坑记录huggingface没有提供 Bart 预训练的代码 facebookresearch/fairseq: Facebook AI Research Sequence-to-Sequence…...

n阶数字回转方阵 ← 模拟法

【问题描述】 请编程输出如下数字回旋方阵。 【算法代码】 #include <bits/stdc.h> using namespace std;const int maxn100; int z[maxn][maxn];void matrix(int n) {int num2;z[0][0]1;int i0,j1;while(i<n && j<n) {while(i<j) z[i][j]num;while(j&…...

【人工智能AI】二、NoSQL 基础知识《NoSQL 企业级基础入门与进阶实战》

写一篇介绍 NoSQL 基础知识的技术文章&#xff0c;分5个章节&#xff0c;每个章节细分到3级目录&#xff0c;重点介绍一下NoSQL 数据模型&#xff0c;NoSQL 数据库架构&#xff0c;NoSQL 数据库特性等&#xff0c;不少于2000字。 NoSQL 基础知识 NoSQL&#xff08;Not Only SQ…...

Camera Rolling Shutter和Global Shutter的区别

卷帘快门&#xff08;Rolling Shutter&#xff09;与全局快门&#xff08;Global Shutter&#xff09;的区别 什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。 快门是照相机的一个重要组成部分&#xff0c;它的结构、形式及功能是衡量照相机档次的一个重要因素。 …...

模版之AnyType

title: 模版之AnyType date: 2023-02-19 21:49:53 permalink: /pages/54a0bf/ categories: 通用领域编程语言C tags:C元编程 author: name: zhengzhibing link: https://azmddy.top/pages/54a0bf/ 模版之AnyType 在研究C的编译期反射时&#xff0c;发现了AnyType很有意思。 首…...

【汇编】一、环境搭建(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧&#xff01; 系统环…...

【博客628】k8s pod访问集群外域名原理以及主机开启了systemd-resolved的不同情况

k8s pod访问集群外域名原理以及使用了systemd-resolved的不同情况 1、不同情况下的linux主机访问外部域名原理 没有使用systemd-resolved的linux主机上访问外部域名一般是按照以下步骤来的&#xff1a; 从dns缓存里查找域名与ip的映射关系 从/etc/hosts里查找域名与ip的映射…...

测试3.测试方法的分类

3.测试分类 系统测试包括回归测试和冒烟测试 回归测试&#xff1a;修改了旧的代码后&#xff0c;重新测试功能是否正确&#xff0c;有没有引入新的错误或导致其它代码产生错误 冒烟测试&#xff1a;目的是确认软件基本功能正常&#xff0c;可以进行后续的正式测试工作 按是否…...

Android 基础知识4-2.9 FrameLayout(帧布局)详解

一、FrameLayout&#xff08;帧布局&#xff09;概述 FrameLayout又称作帧布局&#xff0c;它相比于LinearLayout和RelativeLayout要简单很多&#xff0c;因为它的应用场景也少了很多。这种布局没有方便的定位方式&#xff0c;所有的控件都会默认摆放在布局的左上角。 示例1代…...

Go语言xorm框架

xorm xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。 官网: https://xorm.io/ 中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md 特性 支持 Struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL…...

19_微信小程序之优雅实现侧滑菜单

19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果&#xff0c;布局其实很简单&#xff0c;整体布局是一个横向滚动的scroll-view&#xff0c;难点在于怎么控制侧滑菜单的回弹&#xff0c;以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的&#xf…...

JSP中JDBC与javaBean学习笔记

本博文源于博主偷偷复习期末的java web&#xff0c;博文主要讲述JDBC API与JavaBean&#xff0c;涉及driver,driver Manager\connection、statement接口、PreparedStatement接口、ResultSet接口&#xff0c;JavaBean包含一些标记介绍。 1.JDBC API JDBC由一组接口和类组成&am…...

编译Android系统源码推荐的电脑配置

工欲善其事&#xff0c;必先利其器。 看到很多客户&#xff0c;搞Android产品开发&#xff0c;用的电脑配置是惨不忍睹。 这些老板脑子有坑吗... ------------ 编译Android9推荐电脑配置&#xff1a; 处理器&#xff1a;酷睿i7 5代系列 8线程以上 内存&#xff1a; 8GB以上…...

加油站会员管理小程序实战开发教程10

上一篇我们介绍了计算距离及到店导航的功能,本篇我们介绍一下今日油价的功能。 如果要按日显示最新的数据,那么我们首先需要有数据源来存放每日的油价数据。这里涉及数据源的时候要考虑你的数据是只录入一条,还是每日录入一条。 录入一条呢,比较简单,但有个问题是如果我…...

shell编程之条件判断和流程控制

typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures本节课程目标一、条件判断语法结构2. 条件判断相关参数㈠ 判断文件类型㈡ 判断文件权限㈢ 判断文件新旧㈣ 判断整数㈤ 判断字符串㈥ 多…...

第一次接触jquery

文章目录一.关于jqurey二.什么是jqurey三.上课实例1.表格 2.鼠标移动效果 3隐藏和显示效果代码如下注意一.关于jqurey 简而言之&#xff1a;jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 二.什么是jqurey jQuery 是一个 JavaScript 函数库。 jQu…...

Vue中 引入使用 babel-polyfill 兼容低版本浏览器

注意&#xff1a;本文主要介绍的 vue-cli 版本&#xff1a;3.x&#xff0c; 4.x&#xff1b; 最近在项目中使用 webpack 打包后升级&#xff0c;用户反馈使用浏览器&#xff08;chrome 45&#xff09;访问白屏。经过排查发现&#xff1a;由于 chrome 45 无法兼容 ES6 语法导致的…...

ArcGIS Enterprise on Kubernetes 11.0安装示例

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录安装前置条件基本安装解压文件生成秘钥执行安装脚本配置DNS方法一方法二…...

js 防抖函数 节流函数

某些事件中(如 onresize onscroll onkeydown onkeyup onmousemove …)&#xff0c;会连续触发函数的执行&#xff0c;如果函数执行一些耗时的操作(如请求数据…)&#xff0c;会影响性能&#xff0c;也有可能造成服务器压力。这时可以用 防抖函数 或 节流函数解决这种问题。 防…...

Yarn节点unhealthy解决办法

这几天用Spark计算任务时&#xff0c;发现yarn上有两个节点不参与计算&#xff0c;很是tm的离谱。使用下面的命令查看Yarn上的nodemanager节点状态yarn node -list -all发现两个节点处于unhealthy状态。经过Google查明原因&#xff1a;这种情况一般是因为那个节点上HDFS文件过多…...

【jumpServer 功能梳理】

用户管理 1.1 用户列表 创建jumpServe 账号 ;角色分为用户 管理员&#xff1b;更新账号信息&#xff1b;查看用户详情以及授权的资产&#xff1b; 1.2 用户组 用户组&#xff0c;这个组的意义在于用一个统称对接资源&#xff1b;用户组包含多个用户&#xff0c;可以操作增加删除…...

中国各省人力资本测算就业人员受教育程度构成(2000-2021年)

数据来源&#xff1a;自主整理 时间跨度&#xff1a;2000-2021年 区域范围&#xff1a;全国各省 指标说明&#xff1a; 人力资本测算公式&#xff1a;&#xff08;小学*6初中*9高中*12大专及以上*16&#xff09;/六岁及以上人口 参考文献&#xff1a; [1]罗仁福, 刘承芳,…...

java面试题-集合篇

Collection1.Collection有哪些类&#xff1f;Java集合框架中的Collection接口是所有集合类的基础接口&#xff0c;定义了一些基本的集合操作&#xff0c;如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操…...

Python 异步: 同时运行多个协程(10)

asyncio 的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储&#xff0c;然后同时一起执行。这可以使用 asyncio.gather() 函数来实现。 让我们仔细看看。 1. 什么是 Asyncio gather() asyncio.gather() 模块函数允许调用者将多个可等待对象组合在一…...

SVN 获取多版本间的更新内容

文章目录背景介绍操作步骤 - 获取某段时间内的代码更新内容背景介绍 公司有个项目期初明确要做微信小程序&#xff0c;没有做其他端的意向&#xff0c;并且当时团队人数有限&#xff0c;没有项目实践过 uniapp&#xff0c;项目时间周期紧&#xff0c;就没有用 uniapp 去实现 然…...

c++ const使用说明

作⽤ 1. 修饰变量&#xff0c;说明该变量不可以被改变&#xff1b; 2. 修饰指针&#xff0c;分为指向常量的指针和指针常量&#xff1b; 3. 常量引⽤&#xff0c;经常⽤于形参类型&#xff0c;即避免了拷⻉&#xff0c;⼜避免了函数对值的修改&#xff1b; 4. 修饰成员函数…...

VSTO 开发 EXCEL 委托与多线程的极简示例

VSTO 开发 EXCEL 委托与多线程的极简示例问题解决步骤代码问题 这几天做 excel 加载项时遇到一个问题&#xff0c;对话框弹窗显示后&#xff0c;需要等待网络数据的返回来填充 ListBox 控件&#xff0c;由于网络延迟问题&#xff0c;整个窗体连带 Excel 一起白屏卡顿 5-10秒&a…...

spring之使用Spring的AOP

文章目录前言一、准备工作1、添加相应的依赖2、添加相应的命名空间3、创建目标类4、创建切面二、使用AOP1.在切面类中编写增强代码以及切点表达式2、开启aspectj的自动代理3、测试类4、测试结果前言 Spring对AOP的实现包括以下三种方式 1、Spring框架结合AspectJ框架实现的AOP…...

LeetCode LCP 66. 最小展台数量

力扣嘉年华将举办一系列展览活动&#xff0c;后勤部将负责为每场展览提供所需要的展台。 已知后勤部得到了一份需求清单&#xff0c;记录了近期展览所需要的展台类型&#xff0c; demand[i][j] 表示第 i 天展览时第 j 个展台的类型。 在满足每一天展台需求的基础上&#xff0c;…...

设计模式之模板方法模式

什么是模板方法模式 模板方法模式定义了一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤。     模板方法模式主要包含几下几个角色&#xff1a;         AbstractClass(抽…...

wordpress paypal插件/站长工具seo综合查询怎么关闭

我的开发环境是Win8VS2013&#xff0c;数据库环境是MySQL(WampServer)1、下载MySQL Connector/Net 6.8.3地址&#xff1a;http://dev.mysql.com/downloads/connector/net/还需要下载一个MySQL for VisualStudio版本&#xff0c;用于在VS中可以在数据源中引用MySQL地址&#xf…...

做网站图片路径做缓存吗/今日热点新闻视频

上海最近搞活动调休&#xff0c;要搞深度学习&#xff0c;win上还是不方便&#xff0c;准备弄个ubuntu。于是有以下回忆文字。在机器上装了个双系统。花了两天。再也不想玩了。准备用ubuntu来做深度学习的。本文写于2019年11月4日。机器是神舟Z7-KP7D2&#xff0c;i7-7700HQGTX…...

手机上的html编辑器/天津搜索引擎seo

android apk文件的反编译现在有两种形式,一种是转换成smali的字节码格式,一种是专为jar格式的class文件. 先讲第一种. 首先去下一个apktool.它能将apk转译成smali文件并解析出正确的xm格式l的布局文件. 使用时将需要反编译到apk(如weibo.apk)放到解压后的apktool目录下,运行…...

昌平企业网站建设/百度的代理商有哪些

解决办法 在连接数据库时加上autocommitTrue db pymysql.connect(host“xxx”, user“root”, password“xxx”, db“userprofiles”, charset“utf8”,autocommitTrue) 原因 autocommit的参数必须是True或者False True&#xff1a;在execute时就会立即向数据库发出操作请求…...

前端做的比较好的网站/兰州网络推广的平台

发动机变速箱底盘&#xff0c;构成了传统汽车的三大件。电动化将“发动机变速箱”变成了三电系统&#xff08;电池、电机、电控&#xff09;&#xff0c;而底盘系统仍旧包含了悬架、制动、转向等传统的几大子系统&#xff0c;影响着整车的舒适性、安全性与操控性。 近年来&…...

个人网站cms系统/seod的中文意思

workbook xlrd.open_workbook(rF:\)#获取所有sheetworkbook.sheet_names() 返回一个列表#根据sheet索引或者名称获取sheet内容sheet2 workbook.sheet_by_index(1)sheet2 workbook.sheet_by_name(sheet2)#获取sheet2的名称&#xff0c;行数&#xff0c;列数sheet2.name,sheet…...