一、torch报错:StopIteration: Caught StopIteration in replica 0 on device 0.

问题原因

使用单gpu的时候是正常的,但是使用多gpu的时候会报错。问题是多gpu进行模型训练的时候产生的,具体为,不能够用多gpu加载预训练的bert。应该是torch版本的问题。根据2可以知道,torch1.5版本有这个问题,我是torch1.6也有这个问题,据3替换为torch1.4可以解决该问题。

解决方法

比较简单粗暴的解决方法如下: 注意有如下问题:

File "/miniconda/lib/python3.7/site-packages/pytorch_pretrained_bert/modeling.py", line 727, in forward

extended_attention_mask = extended_attention_mask.to(dtype=next(self.parameters()).dtype) # fp16 compatibility

进入最后一个报错的目录,找到modeling.py(重写了的话就在自己的code里)/miniconda/lib/python3.7/site-packages/pytorch_pretrained_bert/modeling.py 这个路径下的modeling.py脚本把727行的next(self.parameters()).dtype换成torch.float32

二、指定显卡运行程序:

方法一:在终端执行程序时指定GPU

CUDA_VISIBLE_DEVICES=1   python  run_file.py CUDA_VISIBLE_DEVICES=0   bash run.sh 可用以下形式:

CUDA_VISIBLE_DEVICES=1                   Only device 1 will be seen CUDA_VISIBLE_DEVICES=0,1                Devices 0 and 1 will be visible CUDA_VISIBLE_DEVICES=“0,1”              Same as above, quotation marks are optional CUDA_VISIBLE_DEVICES=0,2,3             Devices 0, 2, 3 will be visible; device 1 is masked CUDA_VISIBLE_DEVICES=""                   No GPU will be visible

方法二:在Python代码中指定GPU

import os

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

三、lines = file.readlines()

我刚开始写

with open(file_path, 'r', encoding='utf-8') as file:

    for line in file:

         for elseline in file:

这样并不会双重遍历,只会单层遍历

with open(file_path, 'r', encoding='utf-8') as file:

    lines = file.readlines()

    for line in lines:

         for elseline in lines:

这样就对了,是双重遍历

原因:for line in file:与 lines = file.readlines()   for line in lines:

在 Python 中,file 对象是一个可迭代对象(iterable),表示文件的每一行。当你使用 for line in file: 这样的语法时,它实际上是对文件的迭代,每次迭代都会返回文件中的一行文本。

尝试在嵌套循环中使用 for line in file: 两次可能会导致意外行为,因为文件对象在一次迭代中只会向前移动一次。如果你在内层循环中迭代文件,它会影响外层循环的迭代,可能导致不符合预期的结果。

例如:

with open('example.txt', 'r') as file:

for line_outer in file:

print(f"Outer Loop: {line_outer}")

for line_inner in file:

print(f"Inner Loop: {line_inner}")

在这个例子中,外层循环迭代了文件的每一行,但内层循环会从文件当前位置继续迭代。由于文件对象是迭代器,一旦迭代完成,它就不会重置到文件的开头,因此内层循环将不再执行。

如果需要在同一文件中进行多个嵌套循环迭代,可以考虑使用 file.seek(0) 在内层循环之前将文件的位置重置到文件的开头。但这通常并不是一个高效或推荐的做法,因为会增加文件的 I/O 操作。

区别:

for line in file: 和 lines = file.readlines() 是两种不同的文件读取方式,主要的区别在于它们处理文件内容的方式和在内存中的表示形式。

for line in file::

这种方式逐行读取文件,每次循环迭代一个文本行。优点是它逐行读取,不会一次性加载整个文件到内存中,适用于处理大型文件,效率较高。缺点是在迭代过程中,文件中的每一行都被解析和处理,可能会导致稍微慢一些,特别是对于大型文件。with open('example.txt', 'r') as file:         for line in file:     print(line) lines = file.readlines():

这种方式一次性将整个文件的内容读取到一个列表中,列表中的每个元素代表文件的一行。优点是一次性加载文件内容,适用于小到中等大小的文件。缺点是对于非常大的文件,可能会导致内存占用过大。with open('example.txt', 'r') as file:    lines = file.readlines()    for line in lines:      print(line)

通常情况下,对于大型文件,推荐使用 for line in file: 的方式,因为它在处理文件时是逐行读取的,不会将整个文件加载到内存中。而对于小到中等大小的文件,lines = file.readlines() 可能更方便,因为可以通过索引直接访问文件中的某一行。

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: