Python 使用huggingface Trainer和分布式数据并行

Python 使用huggingface Trainer和分布式数据并行,python,pytorch,huggingface-transformers,Python,Pytorch,Huggingface Transformers,为了加快性能,我查看了pytorches并尝试将其应用于transformer 说明这至少应该更快: DataParallel是单进程、多线程的,仅在一台机器上工作,而DistributedDataParallel是多进程的,可用于单机和多机培训。DataParallel通常比DistributedDataParallel慢,即使在一台机器上也是如此,这是由于线程间的GIL争用、每次迭代复制的模型以及分散输入和收集输出带来的额外开销 我的DataParallel trainer如下所示: 导入操

为了加快性能,我查看了pytorches并尝试将其应用于transformer

说明这至少应该更快:

DataParallel是单进程、多线程的,仅在一台机器上工作,而DistributedDataParallel是多进程的,可用于单机和多机培训。DataParallel通常比DistributedDataParallel慢,即使在一台机器上也是如此,这是由于线程间的GIL争用、每次迭代复制的模型以及分散输入和收集输出带来的额外开销

我的DataParallel trainer如下所示:

导入操作系统
从日期时间导入日期时间
导入系统
进口火炬
来自变形金刚进口培训师,培训论证,BertConfig
培训参数=培训参数(
output_dir=os.path.join(路径存储,'results','mlm'),#输出目录
训练次数=1,训练次数总数
梯度_累计_步数=2,#用于多步累计
每台设备每列批量大小=4,培训期间每台设备的批量大小
每台设备评估批量大小=4,评估批量大小
logging_dir=os.path.join(路径存储,'logs','mlm'),#用于存储日志的目录
在_培训期间评估_=错误,
最大步数=20,
)
mlm\U序列数据集=ProteinBertMaskedLMDataset(
path_vocab,os.path.join(path_存储器,“数据”,“uniparc”,“uniparc\u列车排序.h5”),
)
mlm_config=BertConfig(
vocab_大小=mlm_train_dataset.tokenizer.vocab_大小,
最大位置\u嵌入=mlm\u序列\u数据集。输入\u大小
)
mlm_模型=蛋白质bertformaskedlm(mlm_配置)
教练(

model=mlm#model,#实例化的有点晚了,但无论如何。我将在这里留下这条评论,以帮助任何想知道是否有可能在标记器中保持并行性的人

根据这一点,FastTokenizer似乎是问题所在。 另外,根据的规定,在分叉流程之前不应该使用标记器。(这基本上意味着在遍历数据加载器之前)

因此,解决方案是在培训/微调使用普通令牌之前不要使用FastTokenizer


查看huggingface文档,了解您是否真的需要FastTokenizer。

关于警告:。关于您的实际问题。trainer API实际上是分布式培训的。一些较慢的性能可能可以通过分发一些也尝试分发的内容来解释。我看到它支持分布式培训培训,但没有找到任何示例。因此我想知道我发布的实现是否正确地使用了API。我还没有使用它,但是当文档说它支持分布式培训时,为什么要要求您使用
火炬。多处理
?您也可以从原始培训师使用的输出中看到使用4个gpu的e进程。您的实现使用了4个进程,每个进程有一个gpu。这意味着原始实现已经分散了数据。DistributedDataParallel的思想是每个进程有多个进程,每个进程有一个gpu。因此,是的,我的输出正是我想要的样子。我使用的是
torch。多处理
就是e确切地说,为什么我会问它是否正确,或者是否有一种内在的方法来做到这一点。