最近在试用modelscope 的AI模型。由于公司内网无法直接下载docker文件,不能使用docker镜像。于是只能用pip来安装。
modelscope官方页面pip安装方式推荐的时python3.8,那是个快EOL的版本了,而官方docker镜像提供的已经是python3.10版。哎,看出这个社区文档更新得不勤快啊!
不满足于python3.10,我要装最新的python3.12!干!手搓!
我在一个debian linux里面安装了python3.12后,一切安装modelscope官方页面来。安装pytorch,然后tenserflow,然后安装modelscope,比较顺利。
但运行第一行测试代码from modelscope.pipelines 就报了No module named '_lzma' 。
上网查,一堆文章都只是说要安装一个backports.lzma,然后还要去修改lzma.py。但python官网说lzma已经是标准库自带的。backports.lzma这个是用来支持老版本的。感觉这个解决办法已经过时了。我觉得应该是编译安装python3.12时就越少了库,导致编译出来的python3.12是有缺陷的。
还好我是在docker里面装的python3.12,有问题就立即重编译。几番尝试,最后发现在编译之前要先安装这个包就行了(我的是Debain11,其他linux的库名可能不同。):
apt install liblzma5
apt install liblzma-dev
lzma库import成功后,后面又报了No module named transformers,这是一个huggingface的库。啊?!阿里的modelscope还是要依赖huggingface的库?!有点奇怪。
直接pip install transformers。安装成功。
然后再手动下载了nlp_structbert_word-segmentation_chinese-base 模型里面的所有文件,放到一个目录中。使用时model = Model.from_pretrained('model_path')
最后helloworld实例运行成功!
from modelscope.models import Model
from modelscope.pipelines import pipeline
from modelscope.preprocessors import Preprocessor, TokenClassificationTransformersPreprocessor
model = Model.from_pretrained('/path_to_model/nlp_structbert_word-segmentation_chinese-base')
# tokenizer = Preprocessor.from_pretrained(model.model_dir)
# Or call the constructor directly:
tokenizer = TokenClassificationTransformersPreprocessor(model.model_dir)
word_segmentation = pipeline('word-segmentation', model=model, preprocessor=tokenizer)
input = '今天天气不错,适合出去游玩'
print(word_segmentation(input))
{'output': ['今天', '天气', '不错', ',', '适合', '出去', '游玩']}