NLP模型工程化部署
文章目录
- 一、理论-微服务、测试与GPU
 - 1)微服务架构
 - 2)代码测试
 - 3)GPU使用
 
- 二、实践-封装微服务,编写测试用例和脚本,并观察GPU
 - 1)微服务封装(RestFul和RPC)
 - 2)测试编写(unit_test\api_test\load_test)
 - 3)GPU使用和监控
 
- 三、理论-docker、CICD与K8S
 - 四、实践-构建镜像与CICD脚本
 
一、理论-微服务、测试与GPU
- 学习目标与成果

 
1)微服务架构
①单服务架构
 
 ②微服务架构
 
 ③微服务特点
 
 ④主要技术栈

 1)HTTP协议做RESTFul接口
 
 基于flask web框架实现restful接口
 
 2)远程RPC调用
 
 基于grpc
 
- restful还是rpc

 
2)代码测试

- 具体实践举例

代码测试

压力测试

 
压力测试工具
 
3)GPU使用

 可以使用命令,每一秒刷新一次
watch -n 1 nvidia-smi
 
二、实践-封装微服务,编写测试用例和脚本,并观察GPU
1)微服务封装(RestFul和RPC)
①RestFul接口
 (1)配置日志logger
 
import logging.handlers# 获取logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)# 生成文件handler,打印到文件
# 按天滚动的log,一天滚动一次,只保留最近7个日志文件(即保留最近7天)
file_handler = logging.handlers.TimedRotatingFileHandler('./logs/root.log', 'D', 1, 7, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)# 设置formatter
# 打印日志时间、级别、文件名、行号、函数名字、内容
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)s - %(funcName)s() - %(message)s'
)# 将formatter设置到两个handler
file_handler.setFormatter(formatter)# 将handler设置到logger
logger.addHandler(file_handler) 
(2)编写RESTFUL API
 1>编写hello_resource,配置健康检查路由
#hello_resource.py
from flask_restful import Resourceclass HelloResource(Resource):"""hello路由快速检查服务是否健康"""def get(self):return 'hello' 
2>编写seg_resource,配置分词路由
import json
import timefrom flask import request
from flask_restful import Resourcefrom online import loggerclass SegResource(Resource):"""分词路由主要调用segment.seg"""def __init__(self, segment):# 使用传过来的segment对象,进行后面的分词self.segment = segmentdef post(self):data = request.get_json()  # 解析输入json为一个dictinit_time = time.time()result = {'status': 'OK',  # 本次请求返回状态'msg': ''  # 额外说明}request_id = data.get('request_id')  # 支持传入request_id,便于线上追踪请求try:assert data, "请确保输入不为空"# 从data取用户输入的各种参数content, model, enable_offset, enable_stop_word, use_ner = \data['content'], data.get('model'), data.get('enable_offset', False), \data.get('enable_stop_word', False), data.get('use_ner', False)logger.info('request_id: {}, model: {}, enable_offset: {}, enable_stop_word: {}, use_ner: {}, ''content: {} ...'.format(request_id, model, enable_offset, enable_stop_word, use_ner,content[:100]))# 调用segment对象的seg方法r = self.segment.seg(content, model=model, enable_offset=enable_offset,enable_stop_word=enable_stop_word, use_ner=use_ner)result['result'] = list(r)  # 将分词结果存放在result里面except Exception as e:# 出现异常,打印异常栈,更改本次请求状态为ERRORlogger.exception(e)result['status'] = 'ERROR'result['msg'] = str(e)logger.info('request_id: {}, result: {} ..., cost time: {}s'.format(request_id, json.dumps(result, ensure_ascii=False)[:200], time.time() - init_time))return result 
3>编写其余resource
 4>编写http server
#server.py
import sysfrom flask import Flask
from flask_restful import Apifrom online import logger
from online.http.resources.dict_resource import DictResource
from online.http.resources.hello_resource import HelloResource
from online.http.resources.pos_resource import PosResource
from online.http.resources.seg_resource import SegResource
from segment.segment import Segmentdef start_server(port=8000):# 如果输入第1个参数,将第1个参数解析为端口号if len(sys.argv) > 1:port = int(sys.argv[1])# 实例化flask appapp = Flask(__name__)app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))  # 设置ensure_ascii=False,确保接口返回的中文正常api = Api(app)# 实例化segment对象,准备传入到各个resource里面segment = Segment()resource_class_kwargs = {'segment': segment}# 为api添加hello路由、seg路由、pos路由、dict路由api.add_resource(HelloResource, '/')  # hello路由用于快速检查服务可用性api.add_resource(SegResource, '/seg', resource_class_kwargs=resource_class_kwargs)  # seg路由用于分词api.add_resource(PosResource, '/pos', resource_class_kwargs=resource_class_kwargs)  # pos路由用于词性标注api.add_resource(DictResource, '/dict', resource_class_kwargs=resource_class_kwargs)  # dict路由用于管理词典# 启动服务,设置host port# host='0.0.0.0',表示外部机器可以访问,必须设置为0.0.0.0# threaded=False,表示我们的主程序是单线程模式,需要一个一个处理请求# (我们的word_graph对象不是线程安全的)logger.info('server starts port {}'.format(port))app.run(debug=False, host='0.0.0.0', port=port, threaded=False)if __name__ == '__main__':start_server() 
- 启动APP server
执行脚本start_http_server.sh 
cd ..
python -m online.http.server 8000
 

- 发送POSTman请求
①发送hello相关链接请求 
curl 0.0.0.0:8000
 
服务器打印
 
 客户端回复
 
 ②测试seg分割模型
 postman发送请求
 
 发送seg模块相关
 
②RPC接口
2)测试编写(unit_test\api_test\load_test)
3)GPU使用和监控
三、理论-docker、CICD与K8S
四、实践-构建镜像与CICD脚本
相关文章:
NLP模型工程化部署
文章目录 一、理论-微服务、测试与GPU1)微服务架构2)代码测试3)GPU使用 二、实践-封装微服务,编写测试用例和脚本,并观察GPU1)微服务封装(RestFul和RPC)2)测试编写(unit_test\api_test\load_tes…...
分布式版本管理工具——git 中忽略文件的版本跟踪(初级方法及高级方法)
git工具忽略指定文件的版本跟踪 一、简单方式实现二、复杂方式实现(模式匹配)1. 相关规则2. 应用案例a) 忽略所有内容b) 忽略所有目录(不忽略当前目录的具体文件)c)忽略指定目录下的所有文件,但排除某文件d)…...
【LangChain】Chapter4 - Question and Answer Over Documents
说在前面 文档问答,是常见的一类LLM应用,给定一段可能是从 PDF文件、网页或某公司内部文档库中提取的文本,使用LLM回答关于这些文档内容的问题。这样的应用非常的强大,它可以将LLM与完全没被训练的数据相结合,可以灵活…...
TCP/IP 协议演进中的瓶颈,权衡和突破
所有(去掉 “几乎” 修饰)问题都来自于生长速度的不一致,换句话说,膨胀不是均匀的,从而产生瓶颈甚至触碰极限,TCP/IP 从协议到实现面临的多方问题与动物体型不能无限大,摩天大楼不能无限高本质上一样。 如今被高性能网…...
软件测试面试八股文,查漏补缺(附文档)
大家好,最近有不少小伙伴在后台留言,准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想的…...
IDEA工具使用介绍、IDEA常用设置以及如何集成Git版本控制工具
文章目录 一、IDEA二、建立第一个 Java 程序三、IDEA 常用设置四、IDEA 集成版本控制工具(Git、GitHub)4.1 IDEA 拉 GitHub/Git 项目4.2 IDEA 上传 项目到 Git4.3 更新提交命令 一、IDEA 1、什么是IDEA? IDEA,全称为 IntelliJ ID…...
YOLOv10-1.1部分代码阅读笔记-transformer.py
transformer.py ultralytics\nn\modules\transformer.py 目录 transformer.py 1.所需的库和模块 2.class TransformerEncoderLayer(nn.Module): 3.class AIFI(TransformerEncoderLayer): 4.class TransformerLayer(nn.Module): 5.class TransformerBlock(nn.Module)…...
机器人革新!ModbusTCP转CCLINKIE网关揭秘
在当今这个科技日新月异的时代,机器人技术正以前所未有的速度发展着,它们在工业制造、医疗服务、家庭娱乐等多个领域扮演着越来越重要的角色。而随着机器人应用的普及和多样化,如何实现不同设备之间的高效通信成为了一个亟待解决的问题。开疆…...
JWT包中的源码分析【Golang】
前言 最近在学web编程的途中,经过学长提醒,在进行登陆(Login)操作之后,识别是否登陆的标识应该要放入authorization中,正好最近也在学鉴权,就顺便来看看源码了。 正文 1. 代码示例 在进行分…...
SpringBoot数据字典字段自动生成对应code和desc
效果:接口会返回orderType,但是这个orderType是枚举的类型(1,2,3,4),我想多返回一个orderTypeDesc给前端展示,这样前端就可以直接拿orderTypeDesc使用了。 1. 定义注解 …...
TencentOS 2.4 final 安装mysql8.0备忘录
准备 tencentOS 2.4 与Red Hat Enterprise Linux 7 是兼容的。 我们首先从oracle官网上下载mysql的源文件。 下载完成后你会得到以下文件: mysql84-community-release-el7-1.noarch.rpm 安装 首先你需要切换到root用户下。 1.安装源文件 yum localinstall my…...
Hadoop HA安装配置(容器环境),大数据职业技能竞赛模块A平台搭建,jdk+zookeeper+hadoop HA
HA概述 (1) 所谓HA(High Availablity),即高可用(7*24小时不中断服务)。 (2) 实现高可用最关键的策略是消除单点故障,HA严格来说应该分为各个组件的HA机制,H…...
使用javascript读取波形文件数据,并生成动态的波形图
代码如下: // HTML5 Canvas 动态波形生成器 // 使用JS读取波形文件并生成动态波形// 创建Canvas并设置上下文 const canvas document.createElement(canvas); canvas.width 800; canvas.height 400; document.body.appendChild(canvas); const ctx canvas.getC…...
服务器系统维护与安全配置
一、硬件系统的安全防护 硬件的安全问题也可以分为两种,一种是物理安全,一种是设置安全。 1、物理安全 物理安全是指防止意外事件或人为破坏具体的物理设备,如服务器、交换机、路由器、机柜、线路等。机房和机柜的钥匙一定要管理…...
大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!
大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!DeepSeek-V3上线即开源;OpenAI 发布高级推理模型 o3https://mp.weixin.qq.com/s/9qU_zzIv9ibFdJZ5cTocOw?token47960959&langzh_CN 「青稞大模型Weekly」,持…...
Spring Boot自定义注解获取当前登录用户信息
写在前面 在项目开发过程中,难免都要获取当前登录用户的信息。通常的做法,都是开发一个获取用户信息的接口。 如果在本项目中,多处都需要获取登录用户的信息,难不成还要调用自己写的接口吗?显然不用! 以…...
js创建二维空数组
js创建二维空数组 错误使用原因分析分析1举个例子:解释: 正确创建二维数组总结: 错误使用 今天在写代码的时候,需要创建一个长度为2的空二维数组,我当时第一反应就是,使用let arr new Array(2).fill([])&…...
AF3 checkpoint_blocks函数解读
checkpoint_blocks 函数实现了一种分块梯度检查点机制 (checkpoint_blocks),目的是通过分块(chunking)执行神经网络模块,减少内存使用。在深度学习训练中,梯度检查点(activation checkpointing)是一种显存优化技术。该代码可以: 对神经网络的块(blocks)按需分块,并对…...
下载并使用CICFlowMeter提取网络流特征(Windows版本)
CICFlowMeter简介 CICFlowMeter是一款流量特征提取工具,从原始的pcap包中聚合流,并提取流特征到csv格式的文件中。使用CICFlowMeter提取的特征有助于后续基于网络流的分析与建模 官方github地址:https://github.com/ahlashkari/CICFlowMete…...
深入了解JSON-LD:语义化网络数据的桥梁
目录 前言1. JSON-LD概述1.1 什么是JSON-LD?1.2 JSON-LD的优势 2. JSON-LD的核心概念2.1 上下文(Context)2.2 词汇表(Vocabulary)2.3 标注语言(Markup Language) 3. JSON-LD的语法与结构3.1 基本…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
