安装gluonnlp 0.10.0后导入报错:undefined symbol _PyGen_Send
问题:导入gluonnlp 0.10.0时出现ImportError(Python 3.10.6 + Ubuntu 22.04)
环境与问题
在Ubuntu 22.04.1 LTS服务器的Python 3.10.6环境下,通过pip安装gluonnlp 0.10.0后,执行import gluonnlp as nlp时触发以下ImportError。
错误回溯
Traceback (most recent call last): File "[...]/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3460, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-4-e68c3b59001c>", line 1, in <module> import gluonnlp as nlp File "[...]/lib/python3.10/site-packages/gluonnlp/__init__.py", line 25, in <module> from . import data File "[...]/lib/python3.10/site-packages/gluonnlp/data/__init__.py", line 23, in <module> from . import (batchify, candidate_sampler, conll, corpora, dataloader, File "[...]/lib/python3.10/site-packages/gluonnlp/data/corpora/__init__.py", line 21, in <module> from . import (google_billion_word, large_text_compression_benchmark, wikitext) File "[...]/lib/python3.10/site-packages/gluonnlp/data/corpora/google_billion_word.py", line 34, in <module> from ...vocab import Vocab File "[...]/lib/python3.10/site-packages/gluonnlp/vocab/__init__.py", line 21, in <module> from . import bert, elmo, subwords, vocab File "[...]/lib/python3.10/site-packages/gluonnlp/vocab/bert.py", line 24, in <module> from ..data.transforms import SentencepieceTokenizer File "[...]/lib/python3.10/site-packages/gluonnlp/data/transforms.py", line 48, in <module> from .fast_bert_tokenizer import is_control, is_punctuation, is_whitespace ImportError: [...]/lib/python3.10/site-packages/gluonnlp/data/fast_bert_tokenizer.cpython-310-x86_64-linux-gnu.so: undefined symbol: _PyGen_Send
当前已安装的核心包列表
Package Version ------------------------ ----------- Cython 0.29.33 gluonnlp 0.10.0 mxnet 1.9.1 numpy 1.23.5 sentencepiece 0.1.97
(完整包列表见用户提供的pip list输出)
已尝试操作
- 重装Cython、gluonnlp和mxnet
- 已在项目仓库提交相关issue
解决思路建议
- 升级Cython并源码编译gluonnlp
当前使用的Cython 0.29.33版本较旧,对Python 3.10的兼容性不足。先升级Cython,再强制从源码编译安装gluonnlp,避免使用预编译的不兼容wheel:
pip install --upgrade cython pip uninstall -y gluonnlp pip install gluonnlp==0.10.0 --no-binary :all:
- 调整mxnet版本
gluonnlp 0.10.0与mxnet 1.9.1的组合在Python 3.10下可能存在适配问题,尝试降级mxnet到1.8.0版本:
pip uninstall -y mxnet pip install mxnet==1.8.0
- 替换fast_bert_tokenizer的依赖
如果暂时不需要快速分词功能,可以修改gluonnlp/data/transforms.py文件,注释掉原导入语句,替换为纯Python实现的判断函数:
# 注释原导入行 # from .fast_bert_tokenizer import is_control, is_punctuation, is_whitespace # 添加纯Python实现 def is_control(char): return char in {'\t', '\n', '\r'} or ord(char) <= 31 or ord(char) >= 127 def is_punctuation(char): puncts = {'!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'} return char in puncts or ord(char) >= 127 def is_whitespace(char): return char == ' ' or char == '\t' or char == '\n' or char == '\r' or ord(char) == 0x202F
- 尝试gluonnlp开发版
如果稳定版对Python 3.10支持不足,直接从GitHub安装最新开发版:
pip uninstall -y gluonnlp pip install git+https://github.com/dmlc/gluon-nlp.git
内容的提问来源于stack exchange,提问作者Max Teflon
相关产品推荐
相关产品推荐

