KeyError: 'keys'
AIikai opened this issue · 4 comments
请问出现这个问题是什么原因呢?
2023-02-09 08:23:10 | INFO | fairseq.tasks.translation | /data/home/likai/NMT-offline/knn-box/knnbox-scripts/vanilla-knn-mt/../../data-bin/zh2en-ziyan-03 train zh-en 721 examples
2023-02-09 08:23:11 | INFO | train | | valid on 'train' subset | loss 2.994 | nll_loss 1.346 | ppl 2.54 | wps 0 | wpb 16975 | bsz 721
[vals.npy: (16975,) saved successfully ^_^ ]
||| {'vals': <knnbox.common_utils.memmap.Memmap object at 0x7f9b55f62990>} <class 'knnbox.common_utils.memmap.Memmap'>
Traceback (most recent call last):
File "/data/home/likai/NMT-offline/knn-box/knnbox-scripts/vanilla-knn-mt/../../knnbox-scripts/common/validate.py", line 252, in <module>
cli_main()
File "/data/home/likai/NMT-offline/knn-box/knnbox-scripts/vanilla-knn-mt/../../knnbox-scripts/common/validate.py", line 246, in cli_main
distributed_utils.call_main(args, main, override_args=override_args)
File "/data/home/likai/NMT-offline/knn-box/fairseq/distributed_utils.py", line 301, in call_main
main(args, **kwargs)
File "/data/home/likai/NMT-offline/knn-box/knnbox-scripts/vanilla-knn-mt/../../knnbox-scripts/common/validate.py", line 192, in main
datastore.build_faiss_index("keys", use_gpu=(not args.build_faiss_index_with_cpu)) # build faiss index
File "/data/home/likai/NMT-offline/knn-box/knnbox/datastore/datastore.py", line 177, in build_faiss_index
if not isinstance(self.datas[name], Memmap):
KeyError: 'keys'
能否提供一下运行的脚本内容?从输出来看,我猜测您是在运行保存datastore的脚本,但执行完对数据的forward之后,却没有保存下来对应的keys.npy,因此无法继续进行index的建立操作。
导致这一问题的最大可能,是您脚本当中--knn-mode build_datastore
这部分设置有问题,模型没有运行在保存key的执行模式下
我猜你不需要key所以把保存key的代码注释掉了? 如果是这样,那报这个错是因为工具包在build_datastore的时候会顺便为key建立faiss索引,如果你没保存key,建索引就会报错。解决办法就是不建立索引,把knnbox-scripts/common/validate.py的192行注释掉即可
if knn_type in ["vanilla_knn_mt", "adaptive_knn_mt", "kernel_smoothed_knn_mt", "vanilla_knn_mt_visual", "plac_knn_mt", "robust_knn_mt"]:
datastore.dump() # dump to disk
# 注释掉下一行
datastore.build_faiss_index("keys", use_gpu=(not args.build_faiss_index_with_cpu)) # build faiss index
能否提供一下运行的脚本内容?从输出来看,我猜测您是在运行保存datastore的脚本,但执行完对数据的forward之后,却没有保存下来对应的keys.npy,因此无法继续进行index的建立操作。 导致这一问题的最大可能,是您脚本当中
--knn-mode build_datastore
这部分设置有问题,模型没有运行在保存key的执行模式下
谢谢回复!脚本如下,没怎么改动,只是换用了自己的翻译模型。对的,keys.npy未保存下来,请问该部分代码是在哪个位置?可能是我看遗漏了吧,只保存下来了vals.npy和config.json
`export OMP_WAIT_POLICY=PASSIVE
PROJECT_PATH=$( cd -- "$( dirname -- "$ BASH_SOURCE[0]}" )" &> /dev/null && pwd )/../..
DATA_PATH=$PROJECT_PATH/data-bin/zh2en-ziyan-03
BASE_MODEL=$PROJECT_PATH/pretrain-models/zh-en-old/checkpoint.pt
DATASTORE_SAVE_PATH=$PROJECT_PATH/datastore/vanilla/it
CUDA_VISIBLE_DEVICES=5 python $PROJECT_PATH/knnbox-scripts/common/validate.py $DATA_PATH
--task translation
--path $BASE_MODEL
--model-overrides "{'eval_bleu': False, 'required_seq_len_multiple':1, 'load_alignments': False}"
--dataset-impl mmap
--valid-subset train
--skip-invalid-size-inputs-valid-test
--max-tokens 4096
--bpe fastbpe
--user-dir $PROJECT_PATH/knnbox/models
--arch vanilla_knn_mt@transformer_zh_en_lk
--knn-mode build_datastore
--knn-datastore-path $DATASTORE_SAVE_PATH `
保存key的代码位于knnbox/models/
当中,以vanilla_knn_mt.py
所对应的vanilla_knn_mt@transformer_zh_en
模型为例,您可以注意该文件的第112行:
if self.args.knn_mode == "build_datastore":
keys = select_keys_with_pad_mask(x, self.datastore.get_pad_mask())
# save half precision keys
self.datastore["keys"].add(keys.half())