T5X是JAX和亚麻中T5(以及更多)的新的和改进的实施。 T5在带有MESHTF的Tensorflow上不再积极开发。如果您是T5的新手,我们建议您从T5X开始。
t5库主要用作用统一的文本到文本变压器探索传输学习限制的实验的代码。在本文中,我们演示了如何使用在大型文本语料库中预先训练的文本到文本变压器在多个NLP任务上实现最新的结果。
此存储库中的大部分代码用于加载,预处理,混合和评估数据集。它还提供了一种与出版物一起释放的预培训模型的方法。
t5库可通过为文本到文本任务的混合物提供培训和微调(潜在的巨大)模型来用于未来的模型开发。
图书馆
用法
C4
数据集准备
安装
在GCP上设置TPU
训练
微调
评估
解码
出口
GPU的使用
再现我们的实验
有用的选项
已发布模型检查点
如何引用
t5.data是用于定义提供tf.data.Dataset s的Task对象的软件包。
每个Task都是由:
数据源
文本预处理器函数
句子模型
公制函数
此外,您可以选择提供:
令牌预处理器函数
后进程功能
数据源可以是提供tf.data.Dataset的任意函数,但是我们还为TensorFlow数据集(TFDS)( TfdsTask )中可用的数据集提供了更简单的包装器(TFDSTASK),也可以将其存储为文本文件,每行示例( TextLineTask )一个示例。
文本预处理器将源数据集中的示例转换为具有inputs和targets字段的文本到文本模型的适当格式。 例如,预定义的t5.data.preprocessors.translate预处理器转换为形式的输入
{'de':'das ist肠道。到表格
{'inputs':'将德语翻译成英文:das ist肠道。','targets':'那很好。'}除了文本预处理外,您还可以使用一个或多个令牌预处理器来修改tokenization的输入。我们使用这些令牌预处理器实施了无监督的预训练目标。
我们在t5.data.preprocessors中提供许多预定义的预处理器,但您也可以定义自己的。
句子模型用于代币化输入字符串并解码输出令牌。您可以使用Google/句子库创建自己的模型,或在t5.data.DEFAULT_SPM_PATH上使用我们的默认模型。如果创建自己的,则必须使用标志--pad_id=0 --eos_id=1 --unk_id=2 --bos_id=-1 with spm_train与我们的模型代码兼容。
度量函数返回给定目标和预测的分数。您还可以定义一个后进程功能,以在调用指标之前将目标和预测文本转换为另一种格式。我们在t5.evaluation.metrics中提供一些预定义的指标。
最后, t5.data包含一个Mixture类别,可以实例化,以使用各种功能来指定混合速率来组合多个Task数据集,以用于多任务训练。
t5.evaluation包含两个核心组成部分:
评估期间要使用的指标
在评估时应用这些指标的实用程序
t5.models包含用于将T5 Tasks和Mixtures连接到用于培训,评估和推理的模型实现的垫片。
目前有两个可用的垫片:一个用于网格张量型变压器,我们在纸上使用,另一个用于拥抱面孔变压器库。拥抱面API目前是实验性的,并且可能会发生变化,但提供了一种简单简便的方法,可以使用Pytorch在单个GPU上使用Pytorch进行加载,微调和评估我们的预训练模型。如果您想在TPU上使用我们最大的模型和/或在我们的论文中重现结果,则应使用MTFModel API和t5_mesh_transformer BINARY。如果您有兴趣在Pytorch的GPU上微调我们的模型,则应尝试使用HFPYTORCHMODEL API。由于HFPYTORCHMODEL是实验性的,因此该读数的其余部分假设MTFMODEL及其相关的二进制。 HFPYTORCHMODEL的用法示例可在此处提供。
尝试T5的最简单方法是在我们的COLAB教程中使用免费的TPU。
在下面,我们提供了如何通过我们的代码库从命令行中的模型进行预训练,微调,评估和解码的示例。您可以使用这些说明来重现我们的结果,并使用您自己的数据和/或超级参数来微调我们已发布的检查点之一,或者从头开始预先培训模型。
您可以使用新任务或预先存在的Task ,也可以从预处理的TSV文件中加载示例。
Task根据您的数据源(见上文),您需要适当准备数据。
Task如果使用Vanilla任务,只需确保TPU可以访问dataset_fn的任何文件(即,在GCS存储桶中)即可,您应该很好!
TfdsTask我们的大多数预定义Task s使用TensorFlow数据集(TFD)作为其数据源。当您使用TfdsTask运行我们的培训二进制文件(请参见下面的说明)时,数据集将自动下载并在首次使用时准备。准备完成后,将数据集缓存到您的本地存储空间,以避免将来运行中的开销。 如果在云中工作,建议您将--t5_tfds_data_dir标志设置为指向持续的存储位置,例如GCS存储桶。在TPU培训时,这是一项要求。
我们为无监督的预训练创建的C4数据集提供了Tensorflow数据集中的可用,但是它需要大量的带宽来下载原始的常见爬网刮擦(〜7 TB)并计算其准备工作(〜335 CPU日)。我们建议您利用TFD中的Apache Beam支持,该支持可以对数据集进行分布式预处理,并且可以在Google Cloud DataFlow上运行。有500名工人,这项工作应在约16小时内完成。
在适当地定义MY_PROJECT和MY_BUCKET之后,您可以使用以下命令从GCP中构建数据集中的数据集:
PIP安装tfds-nightly [C4] echo'tfds-nightly [c4]'> /tmp/beam_requirements.txt python -m tensorflow_datasets.scripts.download_and_prepare -datasets = C4/en -data_dir = gs:// $ my_bucket/tensorflow_datasets -beam_pipeline_options =“ project = $ my_project,job_name = c4,staging_location = gs:// $ my_bucket/binaries,temp_location = gs://qymy_bucket/temmy_bucket/temp,,temp carrunner = dataflowrunner = dataflowrunner,requirimements_filetement_filetem_filecter.exexexext.exexeckexect.exexexbert.exexeckexent.Exext = shuffle_mode =服务,区域= $ my_region”
在TFDS梁说明中阅读更多内容。
TextLineTask当您的数据源是每行示例一个示例的文本文件(或文件)时, TextLineTask很有用。然后,您可以使用文本预处理器将每行转换为输入和目标的字典。
确保您的文件可用于TPU(即,在GCS存储桶中),您应该很好!
您可以将TSV文件(或文件)直接用作数据集,而不是定义新Task ,其中每行的格式为<input>t<target> 。
但是,有几个警告:
无法定义文本处理器,因此TSV需要以预处理格式包含您的数据。
当前,当直接使用TSV文件时,当前也无法设置令牌预处理器,后处理功能或度量功能以进行评估。
如果需要这些功能,则必须定义一个新Task , TfdsTask或TextLineTask 。
与上述情况类似,必须访问TPU的TSV文件(即,在GCS存储桶中)。
要安装T5软件包,只需运行:
PIP安装T5 [GCP]
您首先需要在Google Cloud上启动虚拟机(VM)。有关启动VM的详细信息可以在Google Cloud文档上找到。
为了在Cloud TPU上进行培训或评估,您必须根据项目,区域和GCS存储桶进行适当设置以下变量。有关更多详细信息,请参阅Cloud TPU Quickstart指南。
导出项目= your_project_nameexport Zone = your_project_zoneexport buck = gs:// yourbucket/yourbucket/export tpu_name = t5-tpuexport tpu_size = v3-8export data_dir = v3-8export data_dir =“ $ {bucket}请使用以下命令在云VM中创建TPU设备。
ctpu up -name = $ tpu_name -project = $ project -zone = $ ZONE -tpu-size = $ tpu_size
- 仅限tpu- noconf在下面的命令中,我们从头开始训练一个模型MRPC任务。您可以更改MIXTURE_NAME Gin参数以使用包装中提供的任何任务或混合物。
t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {model_dir}”
-t5_tfds_data_dir =“ $ {data_dir}”
-gin_file =“ dataset.gin”
-gin_file =“型号/bi_v1.gin”
-gin_param =“ utils.tpu_mesh_shape.model_parallelism = 1”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”
-gin_param =“ computer_name ='glue_mrpc_v002'”可以通过运行来获得任务和混合物的完整列表:
python -c“导入T5; print(t5.data.mixtureregistry.names())”
您还可以在新文件中定义其他任务和混合物,并使用--module_import标志导入它。
另外,您可以使用TSV文件训练每行的格式为<input>t<target> (请参见上文)。
为了微调我们的预训练模型之一,您需要将预训练模型的手术配置传递给培训脚本。操作配置应作为gin_file标志传递。它指定了模型体系结构和其他超参数。此外,您需要指定混合物以进行微调。例如,要微调glue_mrpc_v002混合物上的T5-Small模型,请运行:
t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {model_dir}”
-t5_tfds_data_dir =“ $ {data_dir}”
-gin_file =“ dataset.gin”
-gin_param =“ utils.tpu_mesh_shape.model_parallelism = 1”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”
-gin_param =“ computer_name ='glue_mrpc_v002'”
-gin_file =“ gs://t5-data/pretraining_models/small/operative_config.gin”正确训练的检查点路径包含在手术配置中。
您还可以在新文件中定义其他任务和混合物,并使用--module_import标志导入它。
另外,您可以使用TSV文件进行微调,其中每行的格式为<input>t<target> (请参见上文)。例如,您可以尝试WMT '19新闻评论14培训集(例如英语 - 法国)中的配对翻译数据集之一。使用TSV文件时,您将用以下方式替换MIXTURE_NAME标志
-gin_param =“ utils.run.train_dataset_fn = @t5.models.mesh_transformer.tsv_dataset_fn” - gin_param =“ tsv_dataset_fn.fn.fln.filename ='
要用我们在论文中使用的相同的超参数(使用0.001的恒定学习率)进行微调,您可以将其传递到T5软件包中包含的此杜松子酒文件中:
--gin_file="learning_rate_schedules/constant_0_001.gin"
设置了预训练模型的操作配置,以便实际上没有限制火车步骤的数量。如果您想培训特定数量的步骤,则需要将其通过。由于预训练的模型已经接受了1,000,000个步骤的培训,您应该指定预训练后的总步骤数量微调。例如,如果您想额外调整10,000步,则应通过
--gin_param="run.train_steps = 1010000"
您也可以使用不同的批次大小进行微调。我们根据批处理中的令牌总数设置批量大小。默认情况下,批次使用512的序列长度。要在批处理中设置令牌数,您应该设置
--gin_param = "tokens_per_batch=1048576"
为了评估T5框架中的模型,您需要使用eval.gin文件,指定模型目录,解码方法以及要评估的检查点步骤。因此,要使用所有检查点上的Beam搜索评估MRPC任务,请使用以下命令:
t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {model_dir}”
-gin_file =“ $ {model_dir}/operative_config.gin”
-t5_tfds_data_dir = $ {data_dir}
-gin_file =“ eval.gin”
-gin_file =“ beam_search.gin”
-gin_param =“ run.dataset_split ='验证'”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”
-gin_param =“ computer_name ='glue_mrpc_v002'”
-gin_param =“ eval_checkpoint_step ='all'”要评估特定的检查点,只需将eval_checkpoint_step参数设置为适当的检查点即可。
--gin_param="eval_checkpoint_step = 100000"
您也可以在上面的命令中使用greedy_decode.gin或sample_decode.gin而不是beam_search.gin 。
为了从T5框架中的模型中产生预测,您需要指定模型目录,解码方法以及用于解码的检查点步骤。假设您有一个存储在/path/to/inputs.txt上的输入序列的文本文件,则示例命令是:
t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {model_dir}”
-gin_file =“ $ {model_dir}/operative_config.gin”
-gin_file =“ peash.gin”
-gin_file =“ sample_decode.gin”
-gin_param =“ input_filename ='/path/to/inputs.txt'”
-gin_param =“ output_filename ='/tmp/outputs.txt'”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”
-gin_param =“ peash_checkpoint_step ='all'”要使用特定的检查点进行预测,只需将infer_checkpoint_step参数设置为适当的检查点即可。
--gin_param="infer_checkpoint_step = 100000"
您还可以在上面的命令中使用beam_search.gin或greedy_decode.gin而不是sample_decode.gin 。
您可能还需要导出一个SavedModel ,这对于服务训练的模型很有用(例如,使用ML Engine或Docker Image部署时)。
t5_mesh_transformer
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {model_dir}”
-use_model_api
-mode =“ export_predict”
-export_dir =“/path/to/export/dir”上面的命令在模型目录中导出最新检查点。要导出特定检查点,请添加以下标志:
-checkpoint_mode =“特定”
- checkpoint_steps = 1000000 T5 Deploy笔记本演示了导出SavedModel并将其包装在Docker图像中以进行服务。
如果您想使用GPU代替TPU,则可以通过删除TPU特定的标志( --tpu , --tpu_zone , --gcp_project )来修改上述命令,并根据您所需的设置设置mesh_shape和mesh_devices的GIN参数。
例如,如果您的计算机可以访问6个GPU,并且您想进行3向模型并行性和2向数据并行性,则上面的微调命令将成为:
t5_mesh_transformer
-model_dir =“ $ {model_dir}”
-t5_tfds_data_dir =“ $ {data_dir}”
-gin_file =“ dataset.gin”
-gin_param =“ utils.run.mesh_shape ='型号:3,批次:2'”
-gin_param =“ utils.run.mesh_devices = ['gpu:0','gpu:1','gpu:2','gpu:3','gpu:4',gpu:5']”
-gin_param =“ computer_name ='glue_mrpc_v002'”
-gin_file =“ gs://t5-data/pretraining_models/small/operative_config.gin”使用一个GPU,该命令是:
t5_mesh_transformer
-model_dir =“ $ {model_dir}”
-t5_tfds_data_dir =“ $ {data_dir}”
-gin_file =“ dataset.gin”
-gin_param =“ utils.run.mesh_shape ='型号:1,批次:1'”
-gin_param =“ utils.run.mesh_devices = ['gpu:0']”
-gin_param =“ computer_name ='glue_mrpc_v002'”
-gin_file =“ gs://t5-data/pretraining_models/small/operative_config.gin”我们为gs:// t5-data/实验的论文中的所有实验提供手术配置。 experiments文件夹具有与论文不同部分相对应的不同子目录。例如,gs:// t5-data/实验/目标包含第3.3节(“无监督目标”)的实验。 objectives文件夹的每个子目录都包含某些特定实验的可操作配置(在我们论文中,一个表中的一排是一个行)。
假设您要重现“前缀语言建模”目标的结果(表4中的第一行)。该实验的手术配置生存在GS:// T5-DATA/实验/目标/OBJ-PREFIX_LM中。在基本目录中,有一个用于预训练模型的操作配置(gs://t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin)。然后,我们考虑的每个下游微调混合物都有子目录,每种混合物都有自己的操作配置(例如,gs://t5-data/experiments/objectives/obj-prefix/obj-prefix_lm/cnn_dailymail_v002/operative_config.gin )。要运行此实验,请首先使用预训练的手术配置进行培训:
导出pritrain_model_dir =“ $ {bucket}/obj-prefix_lm” t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {PROTRAIN_MODEL_DIR}”
-gin_file =“ gs://t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin”
-gin_param =“ utils.tpu_mesh_shape.model_parallelism = 1”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”然后,您可以在CNN/Daily Mail上微调预训练的模型:
export finetune_model_dir =“ $ {桶}/obj-prefix_lm/cnn_dailymail_v002” t5_mesh_transformer
-tpu =“ $ {tpu_name}”
-gcp_project =“ $ {project}”
-tpu_zone =“ $ {ZOIRS}”
-model_dir =“ $ {finetune_model_dir}”
-gin_file =“ gs://t5-data/experiments/objectives/obj-prefix_lm/cnn_dailymail_v002/operative_config.gin”
-gin_param =“ init_checkpoint ='$ {priprain_model_dir} /model.ckpt-524288'”
-gin_param =“ utils.tpu_mesh_shape.model_parallelism = 1”
-gin_param =“ utils.tpu_mesh_shape.tpu_topology ='$ {tpu_size}'”一些培训变体需要同时设置多个标志。对于以下每个变体,将一组标志添加到./third_party/py/t5/google/scripts/run_finetune.sh 。
确定性培训
-train_gin_param =“ mesh_train_dataset_fn.seed = $ {seed}”
-train_gin_param =“ utils.run.skip_seen_data = true”语言模型
-Objective =“ LM” -train_gin_param =“ utils.run.model_type =” lm“”
我们已经发布了以下有关论文中描述的预训练模型的检查点:
T5-SMALL (6000万参数):gs:// t5-data/pretraining_models/small
T5基本(2.2亿参数):GS:// T5-DATA/PRETRAIND_MODELS/BASE
T5-LARGE (7.7亿个参数):GS:// T5-DATA/PRETRAINDE_MODEL/大型
T5-3B (30亿个参数):gs:// t5-data/pretraining_models/3b
T5-11b (110亿个参数):gs:// t5-data/pretraining_models/11b
有关其他实验预训练的模型检查点的列表,请参见此处。
如果您扩展或使用这项工作,请引用引入的纸张:
@Article {2020T5,作者= {Colin Raffel和Noam Shazeer,Adam Roberts,Adam Roberts以及Katherine Lee,Sharan Narang以及Michael Matena和Yanqi Zhou和Wei Li和Peter J. Li and Peter J. Liu}文本到文本变压器},日记= {机器学习研究期刊,年= {2020},音量= {21},number = {140},pages = {1-67},url = {http:/ /jmlr.org/papers/v21/20-074.html}}}}}}