30行代码-使用预训练模型实现中英文翻译
使用facebook/m2m408M模型实现中英文翻译机器人
·
声明, 本文是纯实践导向, 不涉及衍生的理论知识
文章同步更新于:
环境配置:
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))
结果
当然, 这个模型可以翻译的不止这些, 不过中英文应该是我们最常用的了
但是如果你把网络断了, 你会发现没办法用了, 因为这个是调用云端模型进行输出, 那么要怎么实现离线模式?
离线模式
把模型下载下来, 我们使用这个api
from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
# 保存模型,离线可用
tokenizer.save_pretrained("./models/facebook/m2m100_418M")
model.save_pretrained("./models/facebook/m2m100_418M")
会发现在项目根目录多出了 model/facebook/m2m100_418M
改造代码
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请求, 所以也可以用浏览器
打包为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文件放在一个目录)
更多推荐
已为社区贡献1条内容
所有评论(0)