unilm (EdgeLM/fairseq) 中的轻量卷积翻译模型:LightConv 与 DynamicConv 的训练、评估与实现解析
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
本文围绕edgelm/examples/pay_less_attention_paper/README.md展开,系统讲解 EdgeLM(fairseq)仓库中 ICLR 2019 论文 "Pay Less Attention with Lightweight and Dynamic Convolutions" 对应实现的工程全貌:LightConv/DynamicConv 两套预训练翻译模型的获取方式、IWSLT14/WMT14/WMT16/WMT17 训练与评估命令、CUDA 内核的安装方法,以及从源码层面印证卷积算子、GLU、核大小列表与增量解码缓冲的实际实现位置。读完本文后,你可以直接按文档复现训练流程、调用 torch.hub 加载预训练模型,并理解--encoder-conv-type、--encoder-glu、--encoder-kernel-size-list等参数在 模型定义文件 中的真实作用。
一、背景:用轻量动态卷积"少看注意力"
文档开头引用了 Wu et al. (ICLR 2019) 的工作 "Pay Less Attention with Lightweight and Dynamic Convolutions"(arXiv 1901.10430),核心思想是:
- LightConv:使用一组固定、轻量的卷积核(每个注意力头共享一条
kernel_size长度的可学习权重)替代 self-attention,参数量极小; - DynamicConv:卷积核由输入动态生成(每个位置用线性层预测自己的卷积权重),表达力更强但参数量略高;
- 两者都可用 GLU 门控线性单元增强非线性,也可去掉 GLU 换取更快的推理(文档中
no_glu系列模型即为此用途)。
在 EdgeLM 仓库中,该模型以 fairseq 模型注册机制落地:
- 模型注册名是
lightconv,实现在 edgelm/fairseq/models/lightconv.py(@register_model("lightconv")的LightConvModel继承自FairseqEncoderDecoderModel); - 文档中所有训练命令使用的
-a lightconv_iwslt_de_en、--arch lightconv_wmt_en_de_big等架构名,都由该文件末尾的@register_model_architecture("lightconv", ...)注册函数定义; - 卷积算子本体在 edgelm/fairseq/modules/lightweight_convolution.py(LightweightConv / LightweightConv1dTBC)与 edgelm/fairseq/modules/dynamic_convolution.py(DynamicConv1dTBC)中。
二、预训练模型清单(完整继承自文档)
文档提供了 10 个可直接下载的预训练模型。命名规则为<架构>.<是否带GLU>.<数据集>,例如lightconv.no_glu.iwslt14.de-en表示"IWSLT14 德英方向、LightConv 结构、不带 GLU"的模型。部分数据集(IWSLT14、WMT16 en-de)同时提供了不带 GLU的版本,文档明确说明其用途是"faster at inference"(推理更快)。
| Model | Description | Dataset | 模型包内容 |
|---|---|---|---|
lightconv.no_glu.iwslt14.de-en | LightConv(无 GLU) | IWSLT14 German-English | 模型 .tar.gz + IWSLT14 test .tar.bz2 |
dynamicconv.no_glu.iwslt14.de-en | DynamicConv(无 GLU) | IWSLT14 German-English | 模型 .tar.gz + IWSLT14 test .tar.bz2 |
lightconv.no_glu.wmt16.en-de | LightConv(无 GLU) | WMT16 English-German | 模型 .tar.gz + newstest2014(共享词表).tar.bz2 |
dynamicconv.no_glu.wmt16.en-de | DynamicConv(无 GLU) | WMT16 English-German | 模型 .tar.gz + newstest2014(共享词表).tar.bz2 |
lightconv.glu.wmt16.en-de | LightConv | WMT16 English-German | 模型 .tar.gz + newstest2014(共享词表).tar.bz2 |
dynamicconv.glu.wmt16.en-de | DynamicConv | WMT16 English-German | 模型 .tar.gz + newstest2014(共享词表).tar.bz2 |
lightconv.glu.wmt14.en-fr | LightConv | WMT14 English-French | 模型 .tar.gz + newstest2014 .tar.bz2 |
dynamicconv.glu.wmt14.en-fr | DynamicConv | WMT14 English-French | 模型 .tar.gz + newstest2014 .tar.bz2 |
lightconv.glu.wmt17.zh-en | LightConv | WMT17 Chinese-English | 模型 .tar.gz + newstest2017 .tar.bz2 |
dynamicconv.glu.wmt17.zh-en | DynamicConv | WMT17 Chinese-English | 模型 .tar.gz + newstest2017 .tar.bz2 |
这些模型名与仓库源码中的注册项一一对应:edgelm/fairseq/models/lightconv.py 的LightConvModel.hub_models()方法返回了lightconv.no_glu.iwslt14.de-en、lightconv.glu.wmt17.zh-en等全部条目,每条都带tokenizer='moses'、bpe='subword_nmt'的预处理配置。从源码结构看,这正是 torch.hub 能直接按名字加载这些模型的依据。
论文引用(BibTeX)
@inproceedings{wu2018pay, title = {Pay Less Attention with Lightweight and Dynamic Convolutions}, author = {Felix Wu and Angela Fan and Alexei Baevski and Yann Dauphin and Michael Auli}, booktitle = {International Conference on Learning Representations}, year = {2019}, url = {https://arxiv.org/abs/1901.10430}, }三、内存高效的 CUDA 内核
文档指出一個工程痛点:PyTorch 原生实现(unfold/band-matrix 两条路径,见下一节)在长序列下非常吃显存。为此仓库提供了两套 CUDA 内核,在长序列上相比 PyTorch 版本可节省约 50% 显存。
安装命令(对 LightConv 与 DynamicConv 分别执行):
# 安装 lightconv CUDA 内核 cd fairseq/modules/lightconv_layer python cuda_function_gen.py python setup.py install # 安装 dynamicconv CUDA 内核 cd fairseq/modules/dynamicconv_layer python cuda_function_gen.py python setup.py install对应仓库中的真实文件:
- edgelm/fairseq/modules/lightconv_layer/:包含 cuda_function_gen.py、lightconv_cuda.cpp、lightconv_cuda_kernel.cu 与 setup.py;
- edgelm/fairseq/modules/dynamicconv_layer/:包含 cuda_function_gen.py、dynamicconv_cuda.cpp、dynamicconv_cuda_kernel.cu 与 setup.py。
内核自动接管机制可以在源码中得到印证:edgelm/fairseq/modules/lightweight_convolution.py 中的工厂函数LightweightConv(...)会先尝试from fairseq.modules.lightconv_layer import LightconvLayer——若 CUDA 模块已安装则返回 CUDA 版本LightconvLayer,否则回退到纯 PyTorch 的LightweightConv1dTBC并打印 ImportError 信息;edgelm/fairseq/modules/dynamic_convolution.py 的DynamicConv(...)对dynamicconv_layer做同样处理。这就是文档所说"安装后会自动替代 PyTorch 实现"的具体实现方式:无需改任何训练命令。
四、torch.hub 交互式翻译与自定义模型加载
4.1 依赖与 torch.hub 用法
文档要求先安装两个预处理依赖:
pip install sacremoses subword_nmt然后通过 PyTorch Hub 交互式翻译(完整示例继承自文档):
import torch # 列出可用模型 torch.hub.list('pytorch/fairseq') # [..., 'lightconv.glu.wmt17.zh-en', ... ] # 加载 WMT'17 Zh-En 的 LightConv 模型 zh2en = torch.hub.load('pytorch/fairseq', 'lightconv.glu.wmt17.zh-en', tokenizer='moses', bpe='subword_nmt') # 底层模型在 *models* 属性下 assert isinstance(zh2en.models[0], fairseq.models.lightconv.LightConvModel) # 翻译一句话 zh2en.translate('你好 世界') # 'Hello World'4.2 加载本地自定义模型
from fairseq.models.lightconv import LightConvModel en2fr = LightConvModel.from_pretrained( '/path/to/checkpoints', checkpoint_file='checkpoint_best.pt', data_name_or_path='data-bin/wmt14_en_fr', bpe='subword_nmt', bpe_codes='data-bin/wmt14_en_fr/en.code' ) en2fr.translate('Hello world!') # 'Bonjour le monde'从源码结构看,LightConvModel.from_pretrained继承自 fairseq 的FairseqModel基类(FairseqEncoderDecoderModel的通用类方法),因此data_name_or_path必须指向fairseq-preprocess生成的 bin 目录,checkpoint_file需包含与训练时一致的args(含arch、encoder-conv-type等),否则模型无法重建。
五、训练/评估关键开关:conv-type 与 GLU
文档"Training and evaluation options"一节的三条核心规则:
- 使用不带 GLU 的模型:
--encoder-glu 0 --decoder-glu 0; - 使用 LightConv:
--encoder-conv-type lightweight --decoder-conv-type lightweight;默认是 DynamicConv; - 为了最佳 BLEU,可能需要手工调
--lenpen(长度惩罚)。
这三条规则在 edgelm/fairseq/models/lightconv.py 的参数定义中逐一得到印证:
| 参数 | 默认值 | 作用(源码位置) |
|---|---|---|
--encoder-conv-type/--decoder-conv-type | dynamic,可选dynamic/lightweight | 决定每层使用DynamicConv还是LightweightConv(模型文件 中choices=["dynamic", "lightweight"]) |
--encoder-glu/--decoder-glu | 由架构默认值决定 | 开启后在卷积前的线性投影使用Linear(embed_dim, 2*conv_dim)+nn.GLU();关闭则退化为普通Linear(embed_dim, conv_dim)(见 LightConvEncoderLayer) |
--encoder-kernel-size-list/--decoder-kernel-size-list | [3,7,15,31,31,31,31]/[3,7,15,31,31,31] | 每层卷积核大小;若只给 1 个值则复制到所有层,且必须与层数一致(base_architecture) |
--weight-softmax | True | 卷积权重是否做 softmax 归一化(类似注意力权重) |
--weight-dropout | 同--attention-dropout | 对卷积权重做 DropConnect(lightweight_convolution.py 文档字符串明确其为 "the drop rate of the DropConnect to drop the weight") |
逐层核大小的含义:从base_architecture的默认列表[3,7,15,31,31,31,31]可以看出,浅层用较小核感受局部,深层用较大的核覆盖更远上下文——用固定宽度、可学习的"窗口"替代注意力的全局访问,这是该模型"pay less attention"的具体设计。
六、IWSLT14 De-En:单机单卡训练与评估
以下命令完整继承自文档(训练 DynamicConv,无 GLU):
# 训练 SAVE="save/dynamic_conv_iwslt" mkdir -p $SAVE CUDA_VISIBLE_DEVICES=0 $(which fairseq-train)># 训练 SAVE="save/dynamic_conv_wmt16en2de" mkdir -p $SAVE python -m torch.distributed.launch --nproc_per_node 8 $(which fairseq-train) \ ># 训练 SAVE="save/dynamic_conv_wmt14en2fr" mkdir -p $SAVE python -m torch.distributed.launch --nproc_per_node 8 $(which fairseq-train) \ contenteditable="false">【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities
项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考