30行代码-使用预训练模型实现中英文翻译

声明, 本文是纯实践导向, 不涉及衍生的理论知识

环境配置:

python 3.7~3.9, cpu+核显笔记本, m2m100预训练模型(该模型的文档: https://huggingface.co/docs/transformers/main/en/model_doc/m2m_100#overview)

简单实现翻译

导入模型

from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer

 model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
 tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M")

英译中

en_text = "try to use" 
# 被翻译的语言
tokenizer.src_lang = "en"
encoded_en = tokenizer(en_text, return_tensors="pt")
# 输出
generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.get_lang_id("zh"))
print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True))

中译英

chinese_text = "生活就像一盒巧克力。"  
# 被翻译的语言
tokenizer.src_lang = "zh"
encoded_zh = tokenizer(chinese_text, return_tensors="pt")
generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)) 

30行代码-使用预训练模型实现中英文翻译_第1张图片

结果

当然, 这个模型可以翻译的不止这些, 不过中英文应该是我们最常用的了

但是如果你把网络断了, 你会发现没办法用了, 因为这个是调用云端模型进行输出, 那么要怎么实现离线模式?

离线模式

把模型下载下来, 我们使用这个api

from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
# 保存模型,离线可用
tokenizer.save_pretrained("./models/facebook/m2m100_418M")
model.save_pretrained("./models/facebook/m2m100_418M")

会发现在项目根目录多出了 model/facebook/m2m100_418M

30行代码-使用预训练模型实现中英文翻译_第2张图片

改造代码

from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
# 离线模式
tokenizer = M2M100Tokenizer.from_pretrained("./models/facebook/m2m100_418M")
model = M2M100ForConditionalGeneration.from_pretrained("./models/facebook/m2m100_418M")
## zh2en
chinese_text = "生活就像一盒巧克力。"  
# 被翻译的语言
tokenizer.src_lang = "zh"
encoded_zh = tokenizer(chinese_text, return_tensors="pt")
generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)) 
## en2zh
en_text = "try to use" 
# 被翻译的语言
tokenizer.src_lang = "en"
encoded_en = tokenizer(en_text, return_tensors="pt")
# 输出
generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.get_lang_id("zh"))
print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True))

但是每次好像只能本地使用, 还得每次运行文件, 我们如何让它为外界提供服务呢?

使用flask, 改造为http服务(暂不考虑流量负载的问题)

可以使用apifox或postman等测试工具进行测试, 因为是get请求, 所以也可以用浏览器

30行代码-使用预训练模型实现中英文翻译_第3张图片

30行代码-使用预训练模型实现中英文翻译_第4张图片

打包为exe, 在别的电脑上用(打包会耗时比较长, 我的电脑好像要20~30分钟)

使用打包工具 pyinstaller

pip install pyinstaller

在项目根目录运行

# m2m100_transformer.py改为你要打包的python文件名
pyinstaller m2m100_transformer.py 

会多出.spec文件和build, dist目录

在.spec文件hiddenimports里新增一条(因为隐式导入的模块不会被打包, 应该算是小bug?)

hiddenimports=['chatterbot.preprocessors'],

再次打包

pyinstaller m2m100_transformer.spec

打包完成, 会发现dist目录有很多python包, 这些是项目运行需要的, 但是, 如果运行dist里的exe文件, 你会发现报错, 这是因为pyinstaller没办法把所有需要的包都导入, 我们需要手动到python安装目录复制黏贴过来

我的python包存放目录: C:\Users\13695\AppData\Local\Programs\Python\Python39\Lib\site-packages

就是它报错缺什么module, 就进入目录, 复制那个文件夹(包)到你的dist下(和exe文件放在一个目录)

你可能感兴趣的:(ai,python,神经网络,自然语言处理,机器翻译)