一、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()
可能更方便,因为可以通过索引直接访问文件中的某一行。