使用Fairseq进行Bart预训练
文章目录
- 前言
- 环境
- 流程介绍
- 数据部分
- 分词部分
- 预处理部分
- 训练部分
- 遇到的问题
- 问题1
- 可能遇到的问题
- 问题1
- 问题2
前言
- 本文是使用
fairseq做Bart预训练任务的踩坑记录 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.txt,Bart与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
可能遇到的问题
这里可能遇到的问题是我最初遇到的,后来我重新clone了fairseq的仓库,安装了不同版本的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 基础知识的技术文章,分5个章节,每个章节细分到3级目录,重点介绍一下NoSQL 数据模型,NoSQL 数据库架构,NoSQL 数据库特性等,不少于2000字。 NoSQL 基础知识 NoSQL(Not Only SQ…...
Camera Rolling Shutter和Global Shutter的区别
卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别 什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。 快门是照相机的一个重要组成部分,它的结构、形式及功能是衡量照相机档次的一个重要因素。 …...
模版之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的编译期反射时,发现了AnyType很有意思。 首…...
【汇编】一、环境搭建(一只 Assember 的成长史)
嗨~你好呀! 我是一名初二学生,热爱计算机,码龄两年。最近开始学习汇编,希望通过 Blog 的形式记录下自己的学习过程,也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧! 系统环…...
【博客628】k8s pod访问集群外域名原理以及主机开启了systemd-resolved的不同情况
k8s pod访问集群外域名原理以及使用了systemd-resolved的不同情况 1、不同情况下的linux主机访问外部域名原理 没有使用systemd-resolved的linux主机上访问外部域名一般是按照以下步骤来的: 从dns缓存里查找域名与ip的映射关系 从/etc/hosts里查找域名与ip的映射…...
测试3.测试方法的分类
3.测试分类 系统测试包括回归测试和冒烟测试 回归测试:修改了旧的代码后,重新测试功能是否正确,有没有引入新的错误或导致其它代码产生错误 冒烟测试:目的是确认软件基本功能正常,可以进行后续的正式测试工作 按是否…...
Android 基础知识4-2.9 FrameLayout(帧布局)详解
一、FrameLayout(帧布局)概述 FrameLayout又称作帧布局,它相比于LinearLayout和RelativeLayout要简单很多,因为它的应用场景也少了很多。这种布局没有方便的定位方式,所有的控件都会默认摆放在布局的左上角。 示例1代…...
Go语言xorm框架
xorm xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。 官网: https://xorm.io/ 中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md 特性 支持 Struct 和数据库表之间的灵活映射,并支持自动同步事务支持同时支持原始SQL…...
19_微信小程序之优雅实现侧滑菜单
19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果,布局其实很简单,整体布局是一个横向滚动的scroll-view,难点在于怎么控制侧滑菜单的回弹,以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的…...
JSP中JDBC与javaBean学习笔记
本博文源于博主偷偷复习期末的java web,博文主要讲述JDBC API与JavaBean,涉及driver,driver Manager\connection、statement接口、PreparedStatement接口、ResultSet接口,JavaBean包含一些标记介绍。 1.JDBC API JDBC由一组接口和类组成&am…...
编译Android系统源码推荐的电脑配置
工欲善其事,必先利其器。 看到很多客户,搞Android产品开发,用的电脑配置是惨不忍睹。 这些老板脑子有坑吗... ------------ 编译Android9推荐电脑配置: 处理器:酷睿i7 5代系列 8线程以上 内存: 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 简而言之:jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 二.什么是jqurey jQuery 是一个 JavaScript 函数库。 jQu…...
Vue中 引入使用 babel-polyfill 兼容低版本浏览器
注意:本文主要介绍的 vue-cli 版本:3.x, 4.x; 最近在项目中使用 webpack 打包后升级,用户反馈使用浏览器(chrome 45)访问白屏。经过排查发现:由于 chrome 45 无法兼容 ES6 语法导致的…...
ArcGIS Enterprise on Kubernetes 11.0安装示例
博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录安装前置条件基本安装解压文件生成秘钥执行安装脚本配置DNS方法一方法二…...
js 防抖函数 节流函数
某些事件中(如 onresize onscroll onkeydown onkeyup onmousemove …),会连续触发函数的执行,如果函数执行一些耗时的操作(如请求数据…),会影响性能,也有可能造成服务器压力。这时可以用 防抖函数 或 节流函数解决这种问题。 防…...
Yarn节点unhealthy解决办法
这几天用Spark计算任务时,发现yarn上有两个节点不参与计算,很是tm的离谱。使用下面的命令查看Yarn上的nodemanager节点状态yarn node -list -all发现两个节点处于unhealthy状态。经过Google查明原因:这种情况一般是因为那个节点上HDFS文件过多…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
