运行PyTorch Transformer教程代码时遇'NoneType'无Lock属性错误
解决torchtext迭代数据集时的'NoneType'无'Lock'属性错误
这个错误是由于torchtext的DataPipe在Colab环境中初始化多线程锁失败导致的,以下是两种直接有效的解决方式:
针对WikiText2数据集的修改
将数据集转换为普通Python列表,绕过DataPipe的内部迭代逻辑:
from torchtext.datasets import WikiText2 from torchtext.data.utils import get_tokenizer from torchtext.vocab import build_vocab_from_iterator # 转换为普通列表避免锁问题 train_iter = list(WikiText2(split='train')) tokenizer = get_tokenizer('basic_english') vocab = build_vocab_from_iterator(map(tokenizer, train_iter), specials=['<unk>'])
针对IMDB数据集的修改
同样先将数据集转为列表再处理:
from torchtext.datasets import IMDB # 转换为普通列表 train_iter = list(IMDB(split='train')) def tokenize(label, line): return line.split() tokens = [] for label, line in train_iter: tokens += tokenize(label, line)
原理:DataPipe的迭代依赖多进程/线程锁机制,但Colab环境的限制会导致锁对象初始化失败。将数据集转为普通列表后,使用原生Python迭代逻辑,完全避开了DataPipe的锁相关问题。
内容的提问来源于stack exchange,提问作者John Liu
相关产品推荐
相关产品推荐

