NLP模型工程化部署
文章目录
- 一、理论-微服务、测试与GPU
- 1)微服务架构
- 2)代码测试
- 3)GPU使用
- 二、实践-封装微服务,编写测试用例和脚本,并观察GPU
- 1)微服务封装(RestFul和RPC)
- ①RestFul接口
- ②RPC接口
- 2)测试编写(unit_test\api_test\load_test)
- (1)单元测试
- (2)接口测试
- (3)压力测试
- 3)GPU使用和监控
- 三、理论-docker、CICD与K8S
- 四、实践-构建镜像与CICD脚本
- 1)构建镜像
- 2)CI/CD脚本
一、理论-微服务、测试与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接口
1>定义proto接口,然后生成
2>基础实践
syntax = "proto3";service Segment {rpc seg (SegRequest) returns (SegResponse) {}rpc pos (SegRequest) returns (PosResponse) {}rpc add_word (AddWordRequest) returns (Bool) {}rpc delete_word (DeleteWordRequest) returns (Bool) {}
}message SegRequest {string content = 1;string model = 2;bool enable_stop_word = 3;bool use_ner = 4;
}message SegResponse {message Term {string word = 1;int32 start_index = 2;int32 end_index = 3;}repeated Term terms = 1;
}message PosResponse {message Term {string word = 1;int32 start_index = 2;int32 end_index = 3;string pos = 4;}repeated Term terms = 1;
}message Bool {bool status = 1;
}message AddWordRequest {string word = 1;string pos = 2;int32 freq = 3;
}message DeleteWordRequest {string word = 1;
}
编译脚本命令
cd ..
python -m grpc_tools.protoc -Ionline/rpc/ --python_out=online/rpc/ --grpc_python_out=online/rpc/ segment.proto
客户端代码
import grpcfrom online.rpc.segment_pb2 import SegRequest, AddWordRequest, DeleteWordRequest # 引入Request类
from online.rpc.segment_pb2_grpc import SegmentStub # 引入stub,和服务端交互class SegmentClient(object):"""客户端代码,提供给使用方直接import使用作用:定义各种接口将原始函数输入封装为Request对象发送Request到server端,获得返回的Response解析Response对象为python基本类型,返回给用户"""def __init__(self, host, port):"""声明host, port 创建channel通过channel创建stub对象"""channel = grpc.insecure_channel('{}:{}'.format(host, port))self.stub = SegmentStub(channel)def seg(self, content, model, enable_stop_word=False, use_ner=False):"""定义seg接口"""# 将参数封装成request对象request = SegRequest(content=content, model=model, enable_stop_word=enable_stop_word,use_ner=use_ner)# 调用stub.seg方法,传入request对象,得到response对象response = self.stub.seg(request)# 将response对象解析成list of tuple,返回给用户words = [(term.word, term.start_index, term.end_index) for term in response.terms]return wordsdef pos(self, content, model, enable_stop_word=False, use_ner=False):"""定义pos接口"""request = SegRequest(content=content, model=model, enable_stop_word=enable_stop_word,use_ner=use_ner)response = self.stub.pos(request)words = [(term.word, term.start_index, term.end_index, term.pos) for term in response.terms]return wordsdef add_word(self, word, pos, freq):"""定义add_word接口"""request = AddWordRequest(word=word, pos=pos, freq=freq)response = self.stub.add_word(request)status = response.statusreturn statusdef delete_word(self, word):"""定义delete_word接口"""request = DeleteWordRequest(word=word)response = self.stub.delete_word(request)status = response.statusreturn status
2)测试编写(unit_test\api_test\load_test)
(1)单元测试
单元测试代码
import unittest
from segment.segment import Segmentclass MyTestCase(unittest.TestCase):def setUp(self) -> None:self.segment = Segment()def test_seg(self):content = '百年来,我们党始终筑牢“一切为了人民”这一基石。“一切为了人民”是中国共产党保持旺盛生机的密码。' \'十九届五中全会建议稿中突出强调了“扎实推动共同富裕”,这样表述,这在党的全会文件中还是第一次,彰显了“发展为人民”的理念。' \'“江山就是人民,人民就是江山”,中国共产党每一个历史转折,每一个伟大胜利背后,都蕴藏着巨大的人民力量。' \'一百年来,党始终与广大人民群众同舟共济、生死与共,在革命、建设、改革的风雨考验中,矢志不渝为了人民,' \'中国“红船”才能勇往直前,击鼓催征稳驭舟。'print('content: ', content)print('seg(content)')words = list(self.segment.seg(content))print(words)print('seg(content, model=\'HMM\')')words = list(self.segment.seg(content, model='HMM'))print(words)print('seg(content, model=\'CRF\')')words = list(self.segment.seg(content, model='CRF'))print(words)print('seg(content, model=\'DL\')')words = list(self.segment.seg(content, model='DL'))print(words)if __name__ == '__main__':unittest.main()
测试graph
import unittestfrom segment.word_tokenizer.word_graph import WordGraph, Nodeclass TestGraph(unittest.TestCase):def test_graph(self):graph = WordGraph()graph.insert_start_word(WordGraph.NODE_S) # 0graph.insert_start_word(Node('我', 1, 'core_dict')) # 1graph.insert_start_word(Node('喜', 2, 'core_dict')) # 2graph.insert_start_word(Node('喜欢', 4, 'model_word_dict')) # 3graph.insert_start_word(Node('欢', 1, 'core_dict')) # 4graph.insert_end_words([1])graph.insert_end_words([2, 3])graph.insert_end_words([4])graph.insert_end_words([5])graph.insert_end_words([5])route = graph.calculate()print(graph)print(route)assert route[0][0] == 5 # 确保最优路径权重为5if __name__ == '__main__':unittest.main()
(2)接口测试
①test_http_api.py
import json
import random
import unittestimport requestsHOST = '127.0.0.1'
PORT = 8000class MyTestCase(unittest.TestCase):def setUp(self) -> None:self.samples = []with open('tests/data/samples.txt', 'r', encoding='utf-8') as f:for line in f:line = line.strip()if not line:continueself.samples.append(line)def test_seg(self):print('test_seg~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')for sample in self.samples:data = {'content': sample,'model': _sample(['hmm', 'crf', 'dl']),'enable_offset': _sample([True, False])}print(json.dumps(data, ensure_ascii=False))r = requests.post('http://{}:{}/seg'.format(HOST, PORT), json=data)print(r.text)assert r.status_code == 200 and json.loads(r.text)['status'] == 'OK'print('\n')def test_pos(self):print('test_pos~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')for sample in self.samples:data = {'content': sample,'model': _sample(['hmm', 'crf']),}print(json.dumps(data, ensure_ascii=False))r = requests.post('http://{}:{}/pos'.format(HOST, PORT), json=data)print(r.text)assert r.status_code == 200 and json.loads(r.text)['status'] == 'OK'print('\n')def test_dict(self):print('test_dict~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')print('add word')data = {'word': '深度之眼', 'pos': 'nt', 'freq': 50}r = requests.post('http://{}:{}/dict'.format(HOST, PORT), json=data)print(r.text)assert r.status_code == 200 and json.loads(r.text)['status'] == 'OK'print('delete word')data = {'word': '深度之眼'}r = requests.delete('http://{}:{}/dict'.format(HOST, PORT), json=data)print(r.text)assert r.status_code == 200 and json.loads(r.text)['status'] == 'OK'def _sample(values):return random.sample(values, 1)[0]if __name__ == '__main__':unittest.main()
②test_rpc_api.py
import random
import unittestfrom online.rpc.segment_client import SegmentClientHOST = '127.0.0.1'
PORT = 8000class MyTestCase(unittest.TestCase):def setUp(self) -> None:self.client = SegmentClient(host=HOST, port=PORT)self.samples = []with open('tests/data/samples.txt', 'r', encoding='utf-8') as f:for line in f:line = line.strip()if not line:continueself.samples.append(line)def test_seg(self):print('test_seg~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')for sample in self.samples:data = {'content': sample,'model': _sample(['hmm', 'crf', 'dl'])}r = self.client.seg(**data)print(r)print('\n')def test_pos(self):print('test_pos~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')for sample in self.samples:data = {'content': sample,'model': _sample(['hmm', 'crf']),}r = self.client.pos(**data)print(r)print('\n')def test_dict(self):print('test_dict~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')print('add word')data = {'word': '深度之眼', 'pos': 'nt', 'freq': 10}self.client.add_word(**data)print('delete word')data = {'word': '深度之眼'}self.client.delete_word(**data)def _sample(values):return random.sample(values, 1)[0]if __name__ == '__main__':unittest.main()
(3)压力测试
①request.json
{"content": "【惊险一幕!英国伦敦上空一架飞机被三道闪电击中后继续飞行】6月6日,一架飞机在英国伦敦上空飞行时,遭到来自不同方向的三道闪电击中。视频显示,这架航班正穿过风雨交加的天空时,忽然三道闪电从云层中射出,击中了飞机。闪电击中飞机后,空中爆发出隆隆的雷声,飞机看似未受损坏继续飞行。(北京青年报编辑 许彦明)http://t.cn/A62eV2KY【#老奶奶去探病自己躺病床上睡着了# 老爷爷端着伤手 一脸无","model": "crf"
}
②跑测试脚本
siege -c 1 -t 1M --content-type "application/json" "http://127.0.0.1:8000/seg POST <request.json"
siege压力测试工具
测试结果
③观察CPU使用,内存使用,是否存在内存泄漏
3)GPU使用和监控
1)改造bilstm_crf_predictor\bilstm_crf_model,启动GPU加速
2)启动http_server,编辑request.json,更改模型为dl,压测
3)nvidia-smi观察gpu显存占用
三、理论-docker、CICD与K8S
四、实践-构建镜像与CICD脚本
1)构建镜像
- 学习目标
掌握dockerfile的编写,镜像构建以及构建的实际技巧
2)CI/CD脚本
- 学习目标
掌握CI/CD流水线,自动化脚本的编写,pipeline的定义
相关文章:
NLP模型工程化部署
文章目录 一、理论-微服务、测试与GPU1)微服务架构2)代码测试3)GPU使用 二、实践-封装微服务,编写测试用例和脚本,并观察GPU1)微服务封装(RestFul和RPC)①RestFul接口②RPC接口 2)测试编写(unit…...
git时常混淆的操作的笔记
git时常混淆的操作的笔记 写在前面git rebase与merge的不同git am 与git apply的不同删除远端分支 写在前面 离开OS公司后,git的使用不再那么频繁。许多指令,时常忘记,这里作一点笔记。 git rebase与merge的不同 首先,这二者的…...
大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上)
大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上) 前言本篇摘要8. Additional Features:补充特性8.1 队列8.1.1 使用方法8.1.2 配置队列演示 8.2 输入输出流8.2.1 输出流1. 生成器yield2. 流媒体 8.2…...
vue3 Suspense组件
当等待数据的时间比开发人员希望的时间要长时在Vue3中无须自定义代码即可实现 只需要通过Suspense组件管理这一过程。 该组件除了可以给定默认加载数据后的渲染视图,还可以设置加载数据时的应急视图。 例如,在数据加载过程中,会先显示fall…...
Linux 内核调试
系列文章目录 Linux内核学习 QEMU 虚拟机 Linux 调试视频 近阶段补充知识 文章目录 系列文章目录一、WSL二、QEMU1、安装2、退出 三、构建根文件系统1、下载 BusyBox2、编译3、构建文件目录:Makefileinit 四、内核编译1、下载2、构建 五、调试1、GDB 命令调试2、VSC…...
【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】
【华为OD-E卷 - 机房布局 100分(python、java、c、js、c)】 题目 小明正在规划一个大型数据中心机房,为了使得机柜上的机器都能正常满负荷工作,需要确保在每个机柜边上至少要有一个电箱。 为了简化题目,假设这个机房…...
Cursor小试1.生成一个网页的接口请求工具
一般开发过程中,会涉及到接口的调试,往往有时候开发的电脑不是我们自己的,没有安装一些类似postman 的接口调用工具,所以发现问题或者要测试某些接口是否正常的时候会很麻烦,而且现在网上也没有找到很好的免费的网页端接口请求的网址,所以我们使用Cursor来编写这样一个小工具, …...
免费的量化交易股票API有哪些局限性?
免费的量化交易股票 API 存在以下多方面的局限性: 功能限制 数据获取方面: 数据种类不完整:可能仅提供基本的行情数据,如开盘价、收盘价、最高价、最低价等,而深度行情数据(如买卖盘的详细挂单情况…...
leetcode之hot100---148排序链表(C++)
题目要求将一个无序的链表按照升序返回,涉及排序算法,下面对每个排序算法进行回顾 一、交换排序 1.冒泡排序 算法思想:反复比较相邻的两个元素,将它们中较大的(或较小的)元素逐步“冒泡”到数组的末尾。…...
Redis下载与安装
Redis下载与安装 注意:官网没有提供Windows版本,只有Linux版本。 GitHub下载地址: https://github.com/microsoftarchive/redis/releases 这里演示解压版的” Redis-x64-3.2.100.zip”,下载完毕后解压即可。 目录解析: 以管理员…...
TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)
中文版 TF-IDF算法详解:理解与应用 TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索与文本挖掘中常用的算法,广泛应用于搜索引擎、推荐系统以及各种文本分析领域。TF-IDF的核心思想是通过计算一个词在文档中的重要…...
论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)
论文名:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定,替换原模型的self-attention,改为cross-attention 实现 保证图片整体场…...
.Net Core配置系统
目录 Json文件配置 读取配置原始方法 绑定读取配置 用法 传统Web.config配置的缺点为了兼容,仍然可以使用Web.config和ConifgurationManager类,但不推荐.NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等ÿ…...
互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播
在建筑行业,施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步,无人机工地直播技术成为了一种新兴的解决方案,它不仅能够提高施工透明度,还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…...
VirtualBox新版本报错 Invalid installation directory解决方案
最近需要使用到VirtualBox,但是下载最新的安装时发现如下Invalid installation directory,经过多番查找终于找到了解决问题方法,并进行了测试,现将解决办法附上 步骤一、将需要安装VirtualBox的目录下创建个目录 步骤二、使用cmd&…...
PY_11_01
前言 PY_11_01 抄就行了👻 一、代码步骤 抄就行了👻 def fact(n):if n1:return 1else:return n*fact(n-1)while True:minput(请输入一个正整数m:)if not m.isdigit() or int(m)0:print(输入错误,请重新输入!)else:mint(m)brea…...
golang syscall 三种加载DLL方式
1. syscall.MustLoadDLL() MustLoadDLL 是一种加载 DLL 的函数,它会在加载 DLL 时,如果发生错误,直接 panic。 错误处理:如果 DLL 加载失败,它会调用 panic,导致程序崩溃。dll : syscall.MustLoadDLL(&qu…...
Zabbix企业级分布式监控系统
第一章:监控概念及Zabbix部署 监控概述 对于监控系统在企业架构中不是新的技术,但却是必不可少的重要组成部分,所谓无监控,不运维! 监控系统可以帮助运维、开发、测试等人员及时的发现服务器出现的故障,…...
JetPack——Lifecycle
Lifecycle是什么? Lifecycle 是一个类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态 Lifeclcle解决什么问题? class GPS(private val context: Context,pr…...
本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家
文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好!今天我要向大家展示如何将一台迷你的香橙派Z…...
大模型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」,持…...
【0379】Postgres内核 Walreceiver (libpqwalreceiver API)分析
文章目录 1. libpqwalreceiver API1.1 四个函数2. Walreceiver IPC3. Walsender IPC4. Walsender - walreceiver protocol1. libpqwalreceiver API walreceiver 中与传输相关的部分,其负责连接主服务器、接收 WAL 文件以及发送消息,是动态加载的,以避免主服务器的二进制文件…...
easybox
title: 解锁 EasyBox:智能运维的便捷之选 date: ‘2024-12-31’ category: blog tags: EasyBox智能运维效率提升自动化运维 sig: memsafety archives: ‘2024-12’ author:way_back summary: EasyBox 作为一款智能运维工具,以其简洁高效的特性ÿ…...
Prompt工程--AI开发--可置顶粘贴小工具
PROMPT 1.背景要求:我需要开发一个简单的粘贴小工具,用于方便地粘贴和管理文本内容。该工具需要具备以下功能:粘贴功能:提供一个文本框,用户可以粘贴内容。窗口置顶:支持窗口置顶功能,确保窗口…...
【AI日记】24.12.31 kaggle 比赛 2-19
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset时间:9 小时 读书 书名:论婚姻与道德时间:1.5 小时 律己 工作时间:良作息&#x…...
jenkins集成工具(一)部署php项目
目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…...
ubuntu 使用samba与windows共享文件[注意权限配置]
在Ubuntu上使用Samba服务与Windows系统共享文件,需要正确配置Samba服务以及相应的权限。以下是详细的步骤: 安装Samba 首先,确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后,…...
【GridView渐进全解】第四部分GridView分页进阶
目录 一、启用分页 二、修改GridView分页模板 1.进入控件模板修改视图: 2.进入页码模板(PagerTemplate)视图 3.添加导航按钮控件 4.修改导航控件属性 三、输入页号跳转 1.进入页码模板视图 2.添加文本框及按钮控件 3.编写代码 【接…...
K8s集群平滑升级(Smooth Upgrade of K8S Cluster)
简介: Kubernetes (简称K8s)是一个开源的容器编排和管理平台,由Google开发并维护。它最初是为了解决谷歌内部大规模容器管理的问题而设计的,后来在2014年开源,成为云原生技术的核心组成部分。1 K8…...
HarmonyOS-面试整理
目录 为什么选择HarmonyOS/ 优点/特点鸿蒙系统的权限有哪些说一说鸿蒙系统的安全机制说一说鸿蒙系统的微内核与安卓的内核区别鸿蒙操作系统的微内核架构有哪些优势分布式能力在鸿蒙系统中如何实现请解释一下鸿蒙系统中的分布式软总线技术如何在鸿蒙操作系统中进行多设备协同开发…...
基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法
基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法 理解数据分析全流程提问问题:知识的表示方式如何影响模型的推理能力?问题:为什么编程语言会是一个更好的知识表示选择ÿ…...
【北京迅为】iTOP-4412全能版使用手册-第七十章 Linux内核移植
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
使用 ASP.NET Core wwwroot 上传和存储文件
在 ASP.NET Core 应用程序中上传和存储文件是用户个人资料、产品目录等功能的常见要求。本指南将解释使用wwwroot存储图像(可用于文件)的过程以及如何在应用程序中处理图像上传。 步骤 1:设置项目环境 确保您的 ASP.NET 项目中具有必要的依…...
什么是 Azure OpenAI ?了解微软 Azure OpenAI 和 OpenAI 的关系
一、什么是Azure OpenAI ? 微软已与 OpenAI 合作以实现三个主要目标: ⦿利用 Azure 的基础结构(包括安全性、合规性和区域可用性),帮助用户构建企业级应用程序。 ⦿在微软产品(包括 Azure AI 产品以及以外…...
Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案
Flink CDC 自定义函数处理 SQLServer XML类型数据方案 1. 背景 因业务使用SQLServer数据库,CDC同步到doris 数仓。对于SQLServer xml类型,doris没有相应的字段对应, 可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手…...
导致启动nacos报错Caused by: java.lang.IllegalStateException: No DataSource set 的两种原因
Java资深小白,不足之处,或者有任何错误欢迎指出。 --蓝紫报错代码如下: C:\Windows\System32>cd D:\nacos-server-2.2.3\nacos\binC:\Windows\System32>d:D:\nacos-server-2.2.3\nacos\bin>startup.cmd -m standalone "nacos is starting…...
mysql乱码、mysql数据中文问号
网上排出此错误方法的很多,但是 都不简洁,找不到根本原因 主要排查两点: 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…...
python RAG 管道
RAG(RetrievalAugmented Generation)管道是一种结合了信息检索(Retrieval)和文本生成(Generation)的技术框架,主要用于生成高质量、基于事实的文本。它通过从外部知识源(如文档、数据…...
018-spring-基于aop的事务控制
1 先配置平台事务管理器 2 在配置 spring提供的advice 3 事务增强的aop 总结: 事务就是要做2个配置: <!-- 1 开启事务管理器 不同的框架对应不同的事务管理器 --> <bean id"transactionManager" class"org.springframework.j…...
HTML 轮播图(Carousel)详细讲解
HTML 轮播图(Carousel)详细讲解 轮播图(Carousel)是一种常见的用户界面组件,用于在同一位置展示多个图像或内容,允许用户通过滑动或自动播放的方式查看不同的内容。它通常用于展示产品、图片、广告等。 1…...
计算机网络-数据链路层(ppp协议)
2.2 ppp协议 点对点协议ppp是目前使用最广泛的点对点数据链路层协议。 2.3 媒体接入控制基本概念 共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC。 2.3.1 静态划分信道 频分复用 时分复用 波分复用 码分复…...
如何优化Python网络爬虫的数据清洗流程,以提升数据质量并有效应对网站反爬虫机制?
优化爬虫数据清洗流程,应对反爬虫机制 一、数据清洗的重要性 在网络爬虫中,数据清洗是关键环节。打个比方,我们从网页抓取到的原始数据就像一堆杂乱的杂物,里面有各种格式、错误和重复信息。比如抓取到的文本可能包含HTML标签、…...
QSharedMemory 实现数据exe间共享
定义共享数据结构 首先,需要定义一个结构体来包含要共享的数据。这个结构体应该包含所有需要在多个类的实例之间共享的成员变量 struct SharedData {int intValue;QString stringValue;// 可以添加更多需要共享的成员变量}; 使用 QSharedMemory 进行数据共享 在写…...
强化学习(1)
Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标:最大化总…...
Spring Boot 嵌套事务详解及失效解决方案
在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性。然而,在 Spring Boot 中,如果嵌套事务的配置不当,可能会导致事务不生效的问题,尤其是在同一个类中进行方法调用时。 本文将详细介绍嵌套事务的原…...
IDEA 社区版 SpringBoot不能启动
报错原因,Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…...
【SQL server】教材数据库(4)
学生(学号,年龄,性别,系名) 教材(编号,书名,出版社编号,价格) 订购(学号,书号,数量) 出版社(编…...
px、em、rem,vw区别介绍
在网页设计中,px、em、rem 和 vw 都是常用的 CSS 单位,它们各自有不同的用途和特性。下面是这些单位的详细介绍及其区别: 1. px(像素) 定义: px 是最常用的绝对单位,表示屏幕上的一个物理像素…...
pip安装paddle失败
一、pip安装paddle失败,报错如下 Preparing metadata (setup.py) ... error error: subprocess-exited-with-error import common, dual, tight, data, prox ModuleNotFoundError: No module named common [end of output] 二、解决方法: 按照提示安装对…...
QWT 之 QwtPlotDirectPainter直接绘制
QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。 使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的…...