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

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

文章同步更新于:

知乎 公众号: malred编程 知识星球 

环境配置:

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文件放在一个目录)

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞鸟malred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值