Allennlp如何配置使用CPU替代GPU运行本地代码
报错原因
- 核心问题1:预训练SpanModel自带的AllenNLP配置默认指定使用GPU设备,本地无可用GPU时触发设备校验失败。
- 核心问题2:本地安装的GPU版本PyTorch无匹配CUDA驱动,触发CUDA属性检查报错。
配置文件位置
代码中加载模型时指定的save_dir="pretrained_14lap"即为模型根目录,目录下的config.json就是需要修改的AllenNLP配置文件。文件内trainer.cuda_device字段为设备指定项:值为非负整数时调用对应编号的GPU,值为-1时调用CPU。
CPU运行配置方法
优先使用代码层配置,无需修改原配置文件,步骤如下:
- 在代码所有导入语句的最开头添加环境变量,全局禁用CUDA设备识别,避免触发不必要的GPU检查:
import os os.environ["CUDA_VISIBLE_DEVICES"] = ""
- 初始化
SpanModel时显式传入cuda_device=-1参数,强制模型使用CPU加载运行。 - 如果仍抛出
module 'torch.cuda' has no attribute '_check_driver'报错,说明当前环境安装的是GPU版PyTorch且无对应CUDA驱动,卸载后重装CPU版PyTorch即可,执行命令:
pip uninstall torch -y # 你的运行环境为Python3.7,请安装1.13.x及以下兼容版本的CPU版PyTorch pip install torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1
如果当前使用的SpanModel版本不支持直接传入cuda_device参数,再打开pretrained_14lap/config.json,找到trainer节点下的cuda_device字段,将值改为-1后保存即可。
修改后可直接运行的完整代码
# 首行添加环境变量,禁用CUDA设备识别 import os os.environ["CUDA_VISIBLE_DEVICES"] = "" import sys sys.path.append("aste") from pathlib import Path from data_utils import Data, Sentence, SplitEnum from wrapper import SpanModel def predict_sentence(text: str, model: SpanModel) -> Sentence: path_in = "temp_in.txt" path_out = "temp_out.txt" sent = Sentence(tokens=text.split(), triples=[], pos=[], is_labeled=False, weight=1, id=1) data = Data(root=Path(), data_split=SplitEnum.test, sentences=[sent]) data.save_to_path(path_in) model.predict(path_in, path_out) data = Data.load_from_full_path(path_out) return data.sentences[0] text = "Did not enjoy the new Windows 8 and touchscreen functions ." # 显式指定使用CPU加载模型 model = SpanModel(save_dir="pretrained_14lap", random_seed=0, cuda_device=-1) sent = predict_sentence(text, model) print(sent.triples)
内容的提问来源于stack exchange,提问作者Xiaoqing Wan
相关产品推荐
相关产品推荐

