当前位置: 首页 > news >正文

用Flask构建一个AI翻译服务

缘起

首先,看一段代码,只有几行Python语句却完成了AI翻译的功能。

#!/usr/bin/python3import sys
from transformers import MarianMTModel, MarianTokenizerdef translate(word_list):model_name = "Helsinki-NLP/opus-mt-en-zh"tokenizer = MarianTokenizer.from_pretrained(model_name)model = MarianMTModel.from_pretrained(model_name)translated = model.generate(**tokenizer(word_list, return_tensors="pt", padding=True))for res in [tokenizer.decode(t, skip_special_tokens=True) for t in translated]:print(res)if __name__ == "__main__":translate(sys.argv[1:])

这里可以看到,只要调用这个tranlate函数,向它传递一个英语词汇的list,就能返回一个翻译好的中文词汇列表。这里的词汇指的是单词、词组或句子。

不过这个函数有个问题,就是运行起来比较慢。因为它需要加载 tokenizer 和 model. 这最快也要5-6秒;如果这个程序是跑在docker里面,就更慢了,可能要十几甚至几十秒。
(这些tokenizer和model可以由pip install得到,这个在后面再详细介绍。)

所以,总不能每次翻译都要把tokenizer和model都加载一遍。解决的办法也有多种。比如写一个类,在类的实例初始化的时候就把这些加载好,后面调translate函数的时候自然就快了。不过这篇博文里想介绍的方法是,利用一个Python的轻量级的web框架来提供一个Http的服务,从而可以向这个Http服务提出REST请求以获得翻译服务。

第1步 建立virtualenv环境

写Python应用程序的第一步总是建立virtualenv环境,为了避免和本地系统的Python库冲突的情况。

运行以下命令

virtualenv FlaskServer
cd FlaskServer
source bin/activate

注意,本博文的程序基于Linux系统运行。如果在Windows上,则以上的激活命令是不同的。
另外,如果没有安装 virtualenv, 则需要运行pip3 install virtualenv命令进行安装。

第2步 安装必要的库

第二步就是在virtualenv环境下安装必要的library了。
这里需要的库包括翻译模型相关的库以及Flask.

pip install transformers sentencepiece sacremoses
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install Flask

第3步 设计REST请求及返回

我们希望一次能翻译多个单词或词组或句子。那么就需要向翻译服务提供一个list;相应的,翻译之后,也就会返回一个list.
例子如下:

POST /translate # request body example 
{"target_words": ["Hello, what's you name", "I am good", "How are you"]
}# response example
{"translated_words": ["xx", "xxx", "xx"]
}

第4步 完成Flask代码

Flask是一个轻量级的框架。我们只需要撰写很少的代码,即可实现以上的POST请求的backend处理部分。
具体代码如下,假设Python文件名为 hello.py

#!/usr/bin/python3# Run: flask run -h <IP> -p 7979from flask import Flask, request
from transformers import MarianMTModel, MarianTokenizerapp = Flask(__name__)model_name = "Helsinki-NLP/opus-mt-en-zh"
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)@app.route("/")
def hello_world():return "<p>Hello, World!</p>"@app.post("/translate")
def translate():data = request.get_json()word_list = data.get('target_words')translated = model.generate(**tokenizer(word_list, return_tensors="pt", padding=True))key = 'translated_words'result = {key: [tokenizer.decode(t, skip_special_tokens=True) for t in translated]}print(result)return resultif __name__ == '__main__':app.run(host='10.111.222.111',port=7979,debug=True)

从以上代码可以看出,我们在http服务器启动的时候加载了tokenizer和model,而将来接收到 POST /translate请求的时候,translate()函数里的翻译动作的耗时就很短了。

第5步 启动Flask服务器

这一步仍是在virtualenv环境下,运行以下命令

export FLASK_APP=hello.py
export FLASK_ENV=development
flask run -h 10.111.222.111 -p 7979

如果对以上命令不熟悉或容易遗忘,可以查看 flask --helpflask run --help以获得帮助。
这里指定 7979 端口号,是为了避免机器上有其他程序已经占用了Flask的默认端口5000.

至此,我们的翻译服务已经提供好了,下面就是对它进行测试了。

第6步 利用 cURL 发送 POST 翻译请求

运行以下命令

curl -X POST "http://10.111.222.111:7979/translate" -H "Content-Type: application/json" -d'{"target_words": ["clean", "how are you"]}' | jq

注意,这里必须使用 jq程序帮助解析。如果不使用jq,则cURL返回的response的内容会直接显示为像 “\u6d01” 这样的字符串形式,并不会将其按照UTF-解码。
下面是实际的执行效果。

curl -X POST "http://10.111.222.111:7979/translate" -H "Content-Type: application/json; charset=UTF-8" -d'{"target_words": ["clean", "how are you"]}' | jq% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   121  100    79  100    42    121     64 --:--:-- --:--:-- --:--:--   186
{"translated_words": ["清洁","你好吗?"]
}

实测结果,响应速度非常之快,即使包括网络延迟,也不到1秒。

(END)

相关文章:

用Flask构建一个AI翻译服务

缘起 首先&#xff0c;看一段代码&#xff0c;只有几行Python语句却完成了AI翻译的功能。 #!/usr/bin/python3import sys from transformers import MarianMTModel, MarianTokenizerdef translate(word_list):model_name "Helsinki-NLP/opus-mt-en-zh"tokenizer …...

微信小程序引入阿里巴巴iconfont图标并使用

介绍 在小程序里&#xff0c;使用阿里巴巴的图标&#xff0c;如下所示: 使用方式 搜索自己需要的图标&#xff0c;然后将需要用到的图标加入购物车&#xff0c;如下图所示&#xff1a; 去右上角&#xff0c;点击购物车按钮&#xff1b;这里第一次使用&#xff0c;会有三个提…...

mysql面试题49:MySQL中不同text数据类型的最大长度

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a;MySQL中TEXT数据类型的最大长度 在MySQL中&#xff0c;TEXT数据类型用于存储较大…...

从虚拟电厂在上海的实践探索看企业微电网数字化的意义

安科瑞 华楠 作为典型的人口聚集、负荷密集区域&#xff0c;上海市具有外来电比例高、本地资源禀赋不足的特点。从发电侧角度来看&#xff0c;近年来上海风、光等新能源发电装机比例逐年提升&#xff0c;传统的火电逐渐成为调节性发电资源&#xff1b;从负荷侧角度来看上海以第…...

创建并初始化线程池

创建并初始化线程池–》threadpool.h, 创建并初始化&脱离(执行完后)子线程&#xff0c;每个子线程信号量wait阻塞【1】 创建套接字&#xff1a;int listenfd socket( PF_INET, SOCK_STREAM, 0 ); 端口复用&#xff1a;setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &a…...

【LeetCode热题100】--136.只出现一次的数字

136.只出现一次的数字 使用哈希表&#xff1a; class Solution {public int singleNumber(int[] nums) {Map<Integer,Integer> map new HashMap<>();for(int num:nums){Integer count map.get(num);if(count null){count 1;}else{count;}map.put(num,count);}…...

Java idea查看自定义注解的调用地方

Java idea查看自定义注解的调用地方...

ReLU激活函数

LeakyReLU激活函数的具体用法请查看此篇博客&#xff1a;LeakyReLU激活函数 ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数是深度学习中最常用的激活函数之一&#xff0c;它的数学表达式如下&#xff1a; 在这里&#xff0c;(x) 是输入&#xff0c;(f(x)) 是输…...

【Android】adjustViewBounds 的理解和使用

理解 adjustViewBounds 是一个 ImageView 的属性&#xff0c;用于调整 ImageView 的边界以适应图像的尺寸。当设置为 true 时&#xff0c;ImageView 的边界将根据图像的宽高比例进行调整&#xff0c;以确保图像完全显示在 ImageView 内部。 理解和使用 adjustViewBounds 的步…...

Redis知识补充

大key删除 unLink scan分批删除 渐进式rehash Redis笔记&#xff1a;Redis的字典什么时候进行Rehash&#xff1f;_redis什么时候进行rehash-CSDN博客...

IIS 部署.NetCore,最细步骤

服务器安装环境 将.net core程序部署到IIS总体需要经过以下3个大步骤&#xff0c;其中在IIS上配置网站有些比较繁琐&#xff0c;我都会逐一给出详细步骤。 <1>安装IIS和.NetCORE运行时程序 <2>以文件的形式发布.NETCORE程序到指定目录 <3>IIS上面建立网站…...

4.查询用户的累计消费金额及VIP等级

思路分析&#xff1a; &#xff08;1&#xff09;按照user_id及create_date 分组求消费金额total_amount &#xff08;2&#xff09;开窗计算同user_id下的累计销售金额sum(total_amount) over(partition by user_id order by create_date ROWS BETWEEN UNBOUNDED PRECEDING AN…...

解决MySQL错误-this is incompatible with sql_mode=only_full_group_by

报错 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘数据库名.表名.字段名’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 原因 MySQL错误-t…...

UDP通信-广播、组播

UDP的三种通信方式 单播&#xff1a;单台主机与单台主机之间的通信。 广播&#xff1a;当前主机与所在网络中的所有主机通信。 组播&#xff1a;当前主机与选定的一组主机的通信。 UDP如何实现广播 使用广播地址&#xff1a;255.255.255.255 具体操作&#xff1a; 发送端…...

10-bean创建流程1一finishBeanFactoryInitialization(ConfigurableListableBeanFactory

文章目录 1. 方法的主要流程2. ConversionService-如何自定义转换器3. AbstractBeanFactory#getMergedLocalBeanDefinition(String beanName)4.FactoryBean实例化5.内置值处理器1. 方法的主要流程 /*** Finish the initialization of this contexts bean factory,* initializi…...

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】

1、全排列 class Solution { public:vector<vector<int>> ret;vector<int> path;bool check[7];void dfs(vector<int>& nums){if(nums.size() path.size()) {ret.push_back(path);return;}for(int i 0;i < nums.size();i){if(check[i] fals…...

国科云SSL证书讲堂:SSL证书安装常见问题盘点

SSL证书能够对网站传输数据进行加密处理&#xff0c;有效提升网站的数据安全防护能力&#xff0c;逐渐被越来越多的政企网站所应用。但在安装使用SSL证书时&#xff0c;经常会发生各种意想不到的问题&#xff0c;对网站的数据安全和正常访问造成严重影响。本文国科云对安装使用…...

Python3无法调用Sqlalchemy解决(mysqldb)

原因 在安装Sqlalchemy后运行程序报错 无法导入mysqldb&#xff0c;缺失模块 ImportError: No module named ‘MySQLdb’ 既然缺少 MySQLdb 这个模块&#xff0c;尝试按照正常的想法执行 pip install MySQLdbpip install mysql-python 应该能解决&#xff0c;但是却找不到…...

2023/10/15总结

学习总结 最近开始写项目了&#xff0c;然后写的过程中遇到了跨域问题。 为什么会出现跨域问题 由于浏览器的同源策略限制。同源策略是一种约定&#xff0c;它是浏览器最核心也是最基本的安全功能。如果缺少了同源策略&#xff0c;那么浏览器的正常功能可能都会收到影响。所谓…...

关于图像分割SDK的一些基础认识

随着科技的不断发展&#xff0c;图像分割SDK已经成为了一个备受关注的话题。而在众多图像分割SDK中&#xff0c;美摄图像分割SDK以其独特的功能和优势脱颖而出。本文将从美摄图像分割SDK的企业价值和互联网娱乐方面&#xff0c;介绍其宣传文章的具体写作规范。 在企业价值方面&…...

基于主从博弈的主动配电网阻塞管理探索

基于主从博弈的主动配电网阻塞管理 首先&#xff0c;在日前市场中&#xff0c;LA&#xff08;负荷聚合商&#xff09;根据历史数据预测次日向上级电网购电的电价信息和预测分布式电源(燃气轮机)出力、风电场出力信息&#xff0c;同时考虑事前与用户签订协议的可中断负荷&#x…...

Kook Zimage真实幻想Turbo部署教程:OpenStack私有云中幻想图生成服务弹性伸缩方案

Kook Zimage真实幻想Turbo部署教程&#xff1a;OpenStack私有云中幻想图生成服务弹性伸缩方案 1. 项目概述 Kook Zimage真实幻想Turbo是一款专为个人GPU环境优化的幻想风格文生图系统。基于Z-Image-Turbo极速推理架构&#xff0c;通过深度整合专属幻想模型权重&#xff0c;实…...

ESFT-gate-law-lite:法律文本智能分析新工具

ESFT-gate-law-lite&#xff1a;法律文本智能分析新工具 【免费下载链接】ESFT-gate-law-lite ESFT-gate-law-lite是基于HuggingFace的深度学习模型&#xff0c;专为法律领域定制。源自deepseek-ai团队&#xff0c;继承ESFT-vanilla-lite优势&#xff0c;强大而轻量&#xff0c…...

BLE5.1 与蓝牙Mesh 在手环数字车钥匙中的角色与体验升级

可穿戴数字车钥匙把传统实体钥匙的能力收敛到手环、手表等贴身设备上&#xff0c;通过近距无线链路与车载控制器或专用通信单元交互&#xff0c;支持解闭锁、启动、迎宾等操作。典型实现会组合 低功耗蓝牙&#xff08;BLE&#xff09; 做常在线链路与距离感知&#xff0c;并以 …...

3个步骤玩转虚拟手柄模拟:ViGEmBus驱动从入门到精通

3个步骤玩转虚拟手柄模拟&#xff1a;ViGEmBus驱动从入门到精通 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus Windows虚拟手柄驱动技术为游戏玩家和开发者…...

计算机毕业设计springboot月子中心健康管理系统 基于SpringBoot的母婴护理中心智能管理平台 产后康复中心信息化服务系统

计算机毕业设计springboot月子中心健康管理系统7639p9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享随着国家三胎政策的放开和居民生活水平的提升&#xff0c;现代家庭对产后护理服务的专业化、…...

突破数字阅读壁垒:bypass-paywalls-chrome-clean工具深度实战指南

突破数字阅读壁垒&#xff1a;bypass-paywalls-chrome-clean工具深度实战指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息获取成本日益增高的今天&#xff0c;优质内容常常…...

ReplaceItems.jsx:Adobe Illustrator批量对象替换的终极解决方案

ReplaceItems.jsx&#xff1a;Adobe Illustrator批量对象替换的终极解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Illustrator中重复的替换操作而烦恼吗&#xff1…...

基于人工电场搜索智能优化算法的水库发电和供水优化调度

基于人工电场搜索智能优化算法的水库发电和供水优化调度&#xff1b; 代码为MATLAB编写&#xff0c;可直接运行&#xff1b; 含有实例数据&#xff0c;点击即可运行&#xff0c;替换成自己数据点击即可出结果&#xff0c;如图。在水库管理中&#xff0c;实现发电和供水的优化调…...

三层交换机vlan间互通配置

SW1&#xff08;三层交换机&#xff09;配置# 1. 创建VLAN sysname LSW1 vlan batch 100 200 300# 2. 配置接口并加入VLAN interface GigabitEthernet 0/0/4port link-type accessport default vlan 100stp disable # 关闭生成树 interface GigabitEthernet 0/0/5port link-ty…...