UIE_Slim满足工业应用场景,解决推理部署耗时问题,提升效能。
项目链接:fork一下即可
UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能!
如果有图片缺失查看原项目
UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能
在UIE强大的抽取能力背后,同样需要较大的算力支持计算。在一些工业应用场景中对性能的要求较高,若不能有效压缩则无法实际应用。因此,基于数据蒸馏技术构建了UIE Slim数据蒸馏系统。其原理是通过数据作为桥梁,将UIE模型的知识迁移到封闭域信息抽取小模型,以达到精度损失较小的情况下却能达到大幅度预测速度提升的效果。
FasterTokenizer是一款简单易用、功能强大的跨平台高性能文本预处理库,集成业界多个常用的Tokenizer实现,支持不同NLP场景下的文本预处理功能,如文本分类、阅读理解,序列标注等。结合PaddleNLP Tokenizer模块,为用户在训练、推理阶段提供高效通用的文本预处理能力。use_faster: 使用C++实现的高性能分词算子FasterTokenizer进行文本预处理加速
UIE数据蒸馏三步
Step 1: 使用UIE模型对标注数据进行finetune,得到Teacher Model。
Step 2: 用户提供大规模无标注数据,需与标注数据同源。使用Taskflow UIE对无监督数据进行预测。
Step 3: 使用标注数据以及步骤2得到的合成数据训练出封闭域Student Model。
效果展示:
测试硬件情况:
1点算力卡对应的:
V100 32GB
GPUTesla V100
Video Mem32GB
CPU4 Cores
RAM32GB
Disk100GB
模型 | 模型计算运行时间 | precision | recall | F1 |
---|---|---|---|---|
uie-base | 68.61049008s | 0.69277 | 0.72327 | 0.70769 |
uie-mini | 28.932519437s | 0.74138 | 0.54088 | 0.62545 |
uie-micro | 26.36701917 | 0.74757 | 0.48428 | 0.58779 |
uie-nano | 24.8937761 | 0.74286 | 0.49057 | 0.59091 |
蒸馏mini | 6.839258904s | 0.7732 | 0.75 | 0.76142 |
蒸馏micro | 6.776990s | 0.78261 | 0.72 | 0.75 |
蒸馏nano | 6.6231770s | 0.7957 | 0.74 | 0.76684 |
模型计算运行时间:
模型 | 模型计算运行时间 | 提速x倍 |
---|---|---|
UIE base | 203.95947s | 1 |
UIE base + FasterTokenizer | 177.1798s | 1.15 |
UIE蒸馏mini | 21.97979s | 9.28 |
UIE蒸馏mini + FasterTokenizer | 20.1557s | 10.12 |
Archive: data.zip
- inflating: ./data/unlabeled_data.txt
- inflating: ./data/doccano_ext.json
示例数据包含以下两部分:
名称 | 数量 |
---|---|
doccano格式标注数据(doccano_ext.json) | 200 |
无标注数据(unlabeled_data.txt) | 1277 |
1. 进行预训练微调,得到Teacher Model
具体参数以及doccano标注细节参考文档:
Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】
PaddleNLP之UIE信息抽取小样本进阶(二)[含doccano详解]
Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)
UIE:模型
模型 | 结构 | 语言 | 大小 |
---|---|---|---|
uie-base (默认) | 12-layers, 768-hidden, 12-heads | 中文 | 118M |
uie-base-en | 12-layers, 768-hidden, 12-heads | 英文 | 118M |
uie-medical-base | 12-layers, 768-hidden, 12-heads | 中文 | |
uie-medium | 6-layers, 768-hidden, 12-heads | 中文 | 75M |
uie-mini | 6-layers, 384-hidden, 12-heads | 中文 | 27M |
uie-micro | 4-layers, 384-hidden, 12-heads | 中文 | 23M |
uie-nano | 4-layers, 312-hidden, 12-heads | 中文 | 18M |
uie-m-large | 24-layers, 1024-hidden, 16-heads | 中、英文 | 实际大小2G |
uie-m-base | 12-layers, 768-hidden, 12-heads | 中、英文 | 实际大小1G |
实际模型大小解释:
base模型118M parameters是指base模型的参数个数,因为同一个模型可以被不同的精度来表示,例如float16,float32,下载下来是450M左右(存储空间大小),是因为下载的模型是float32,118M * 4 大概是存储空间的量级。
!python finetune.py \
--train_path "./data/train.txt" \
--dev_path "./data/dev.txt" \
--save_dir "./checkpoint" \
--learning_rate 5e-6 \
--batch_size 16 \
--max_seq_len 512 \
--num_epochs 10 \
--model "uie-base" \
--seed 1000 \
--logging_steps 10 \
--valid_steps 50 \
--device "gpu"
base模型部分结果展示:
[2022-09-08 17:26:55,701] [ INFO] - Evaluation precision: 0.69375, recall: 0.69811, F1: 0.69592
[2022-09-08 17:27:01,145] [ INFO] - global step 260, epoch: 9, loss: 0.00172, speed: 1.84 step/s
[2022-09-08 17:27:06,448] [ INFO] - global step 270, epoch: 9, loss: 0.00168, speed: 1.89 step/s
[2022-09-08 17:27:12,102] [ INFO] - global step 280, epoch: 10, loss: 0.00165, speed: 1.77 step/s
[2022-09-08 17:27:17,607] [ INFO] - global step 290, epoch: 10, loss: 0.00162, speed: 1.82 step/s
[2022-09-08 17:27:22,899] [ INFO] - global step 300, epoch: 10, loss: 0.00159, speed: 1.89 step/s
[2022-09-08 17:27:26,577] [ INFO] - Evaluation precision: 0.69277, recall: 0.72327, F1: 0.70769
[2022-09-08 17:27:26,577] [ INFO] - best F1 performence has been updated: 0.69841 --> 0.70769
2.离线蒸馏
2.1 通过训练好的UIE定制模型预测无监督数据的标签
用户提供大规模无标注数据,需与标注数据同源。使用Taskflow UIE对无监督数据进行预测。
References:
GlobalPointer:用统一的方式处理嵌套和非嵌套NER:
GPLinker:基于GlobalPointer的实体关系联合抽取
%cd /home/aistudio/data_distill
!python data_distill.py \
--data_path /home/aistudio/data \
--save_dir student_data \
--task_type relation_extraction \
--synthetic_ratio 10 \
--model_path /home/aistudio/checkpoint/model_best
可配置参数说明:
data_path: 标注数据(doccano_ext.json)及无监督文本(unlabeled_data.txt)路径。
model_path: 训练好的UIE定制模型路径。
save_dir: 学生模型训练数据保存路径。
synthetic_ratio: 控制合成数据的比例。最大合成数据数量=synthetic_ratio*标注数据数量。
task_type: 选择任务类型,可选有entity_extraction,relation_extraction,event_extraction和opinion_extraction。因为是封闭域信息抽取,需指定任务类型。
seed: 随机种子,默认为1000。
parser.add_argument("--data_path", default="../data", type=str, help="The directory for labeled data with doccano format and the large scale unlabeled data.")
parser.add_argument("--model_path", type=str, default="../checkpoint/model_best", help="The path of saved model that you want to load.")
parser.add_argument("--save_dir", default="./distill_task", type=str, help="The path of data that you wanna save.")
parser.add_argument("--synthetic_ratio", default=10, type=int, help="The ratio of labeled and synthetic samples.")
parser.add_argument("--task_type", choices=['relation_extraction', 'event_extraction', 'entity_extraction', 'opinion_extraction'], default="entity_extraction", type=str, help="Select the training task type.")
parser.add_argument("--seed", type=int, default=1000, help="Random seed for initialization")
可配置参数说明:
model_path: 训练好的UIE定制模型路径。
test_path: 测试数据集路径。
label_maps_path: 学生模型标签字典。
batch_size: 批处理大小,默认为8。
max_seq_len: 最大文本长度,默认为256。
task_type: 选择任务类型,可选有entity_extraction,relation_extraction,event_extraction和opinion_extraction。因为是封闭域信息抽取的评估,需指定任务类型。
parser.add_argument("--model_path", type=str, default=None, help="The path of saved model that you want to load.")
parser.add_argument("--test_path", type=str, default=None, help="The path of test set.")
parser.add_argument("--encoder", default="ernie-3.0-base-zh", type=str, help="Select the pretrained encoder model for GP.")
parser.add_argument("--label_maps_path", default="./ner_data/label_maps.json", type=str, help="The file path of the labels dictionary.")
parser.add_argument("--batch_size", type=int, default=16, help="Batch size per GPU/CPU for training.")
parser.add_argument("--max_seq_len", type=int, default=128, help="The maximum total input sequence length after tokenization.")
parser.add_argument("--task_type", choices=['relation_extraction', 'event_extraction', 'entity_extraction', 'opinion_extraction'], default="entity_extraction",
2.3学生模型训练
底座模型可以参考下面进行替换!
!python train.py \
--task_type relation_extraction \
--train_path student_data/train_data.json \
--dev_path student_data/dev_data.json \
--label_maps_path student_data/label_maps.json \
--num_epochs 200 \
--encoder ernie-3.0-mini-zh
# %cd /home/aistudio/data_distill
!python train.py \
--task_type relation_extraction \
--train_path student_data/train_data.json \
--dev_path student_data/dev_data.json \
--label_maps_path student_data/label_maps.json \
--num_epochs 100 \
--encoder ernie-3.0-mini-zh\
--device "gpu"\
--valid_steps 100\
--logging_steps 10\
--save_dir './checkpoint2'\
--batch_size 16
3.Taskflow部署学生模型以及性能测试
通过Taskflow一键部署封闭域信息抽取模型,task_path为学生模型路径。
demo测试
from pprint import pprint
from paddlenlp import Taskflow
ie = Taskflow("information_extraction", model="uie-data-distill-gp", task_path="checkpoint2/model_best/") # Schema 在闭域信息抽取中是固定的
pprint(ie("登革热@结果 升高 ### 血清白蛋白水平 检查 结果 检查 在资源匮乏地区和富足地区,对有症状患者均应早期检测。"))
[{'疾病': [{'end': 3,
'probability': 0.9995957,
'relations': {'实验室检查': [{'end': 21,
'probability': 0.99892455,
'relations': {},
'start': 14,
'text': '血清白蛋白水平'}],
'影像学检查': [{'end': 21,
'probability': 0.99832386,
'relations': {},
'start': 14,
'text': '血清白蛋白水平'}]},
'start': 0,
'text': '登革热'}]}]
from pprint import pprint
import json
from paddlenlp.taskflow import Taskflow
import pandas as pd
#运行时间
import time
def openreadtxt(file_name):
data = []
file = open(file_name,'r',encoding='UTF-8') #打开文件
file_data = file.readlines() #读取所有行
for row in file_data:
data.append(row) #将每行数据插入data中
return data
# 时间1
old_time = time.time()
data_input=openreadtxt('/home/aistudio/数据集/unlabeled_data.txt')
few_ie = Taskflow("information_extraction", model="uie-data-distill-gp", task_path="/home/aistudio/data_distill/checkpoint2/model_best",batch_size=32) # Schema 在闭域信息抽取中是固定的
# 时间1
current_time = time.time()
print("数据模型载入运行时间为" + str(current_time - old_time) + "s")
#时间2
old_time1 = time.time()
results=few_ie(data_input)
current_time1 = time.time()
print("模型计算运行时间为" + str(current_time1 - old_time1) + "s")
#时间2
#时间三
old_time3 = time.time()
test = pd.DataFrame(data=results)
test.to_csv('/home/aistudio/output/reslut.txt', sep='\t', index=False,header=False) #本地
# with open("/home/aistudio/output/reslut.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
# for result in results:
# line = json.dumps(result, ensure_ascii=False) #对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
# f.write(line + "\n")
current_time3 = time.time()
print("数据导出运行时间为" + str(current_time3 - old_time3) + "s")
# for idx, text in enumerate(data):
# print('Data: {} \t Lable: {}'.format(text[0], results[idx]))
print("数据结果已导出")
**mini运行时间:**
数据模型载入运行时间为0.8430757522583008s
模型计算运行时间为6.839258909225464s
数据导出运行时间为0.008304595947265625s
**nano运行时间:**
数据模型载入运行时间为0.5164840221405029s
模型计算运行时间为6.6231770515441895s
数据导出运行时间为0.023623943328857422s
**micro运行时间:**
数据模型载入运行时间为0.5323500633239746s
模型计算运行时间为6.77699007987976s
数据导出运行时间为0.04320549964904785s
4 进行预训练模型UIE-mini并测试推理时间
封闭域UIE的schema是固定的,可以在label_maps.json查看
0:"手术治疗"
1:"实验室检查"
2:"影像学检查"
from pprint import pprint
import json
from paddlenlp import Taskflow
import pandas as pd
#运行时间
import time
def openreadtxt(file_name):
data = []
file = open(file_name,'r',encoding='UTF-8') #打开文件
file_data = file.readlines() #读取所有行
for row in file_data:
data.append(row) #将每行数据插入data中
return data
# 时间1
old_time = time.time()
data_input=openreadtxt('/home/aistudio/数据集/unlabeled_data.txt')
schema = {'疾病': ['手术治疗', '实验室检查', '影像学检查']}
# few_ie = Taskflow('information_extraction', schema=schema, batch_size=32,task_path='/home/aistudio/checkpoint_mini/model_best') #自行切换
few_ie = Taskflow('information_extraction', schema=schema, batch_size=32,task_path='/home/aistudio/checkpoint_micro/model_best')
# 时间1
current_time = time.time()
print("数据模型载入运行时间为" + str(current_time - old_time) + "s")
#时间2
old_time1 = time.time()
results=few_ie(data_input)
current_time1 = time.time()
print("模型计算运行时间为" + str(current_time1 - old_time1) + "s")
#时间2
#时间三
old_time3 = time.time()
test = pd.DataFrame(data=results)
test.to_csv('/home/aistudio/output/reslut.txt', sep='\t', index=False,header=False) #本地
# with open("/home/aistudio/output/reslut.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
# for result in results:
# line = json.dumps(result, ensure_ascii=False) #对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
# f.write(line + "\n")
current_time3 = time.time()
print("数据导出运行时间为" + str(current_time3 - old_time3) + "s")
# for idx, text in enumerate(data):
# print('Data: {} \t Lable: {}'.format(text[0], results[idx]))
print("数据结果已导出")
通过上述程序自行切换:加载对应模型
记录推理时间:
**uie-nano**
数据模型载入运行时间为0.3770780563354492s
模型计算运行时间为24.893776178359985s
数据导出运行时间为0.01157689094543457s
**uie-micro**
数据模型载入运行时间为0.39632749557495117s
模型计算运行时间为26.367019176483154s
数据导出运行时间为0.012260198593139648s
**uie-mini**
数据模型载入运行时间为0.5642790794372559s
模型计算运行时间为28.93251943588257s
数据导出运行时间为0.01435089111328125s
**uie-base**
数据模型载入运行时间为1.4756040573120117s
模型计算运行时间为68.61049008369446s
数据导出运行时间为0.02205801010131836s
5.提前尝鲜UIE FasterTokenizer加速,提升推理性能
FasterTokenizer是一款简单易用、功能强大的跨平台高性能文本预处理库,集成业界多个常用的Tokenizer实现,支持不同NLP场景下的文本预处理功能,如文本分类、阅读理解,序列标注等。结合PaddleNLP Tokenizer模块,为用户在训练、推理阶段提供高效通用的文本预处理能力。
use_faster: 使用C++实现的高性能分词算子FasterTokenizer进行文本预处理加速。需要通过pip install faster_tokenizer
安装FasterTokenizer库后方可使用。默认为False
。更多使用说明可参考[FasterTokenizer文档]
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/faster_tokenizer/README.md
特性
高性能。由于底层采用C++实现,所以其性能远高于目前常规Python实现的Tokenizer。在文本分类任务上,FasterTokenizer对比Python版本Tokenizer加速比最高可达20倍。
跨平台。FasterTokenizer可在不同的系统平台上使用,目前已支持Windows x64,Linux x64以及MacOS 10.14+平台上使用。
多编程语言支持。FasterTokenizer提供在C++、Python语言上开发的能力。
灵活性强。用户可以通过指定不同的FasterTokenizer组件定制满足需求的Tokenizer。
FAQ
Q:我在AutoTokenizer.from_pretrained接口上已经打开use_faster=True开关,为什么文本预处理阶段性能上好像没有任何变化?
A:在有三种情况下,打开use_faster=True开关可能无法提升性能:
没有安装faster_tokenizer。若在没有安装faster_tokenizer库的情况下打开use_faster开关,PaddleNLP会给出以下warning:"Can’t find the faster_tokenizer package, please ensure install faster_tokenizer correctly. "。
加载的Tokenizer类型暂不支持Faster版本。目前支持4种Tokenizer的Faster版本,分别是BERT、ERNIE、TinyBERT以及ERNIE-M Tokenizer。若加载不支持Faster版本的Tokenizer情况下打开use_faster开关,PaddleNLP会给出以下warning:“The tokenizer XXX doesn’t have the faster version. Please check the map paddlenlp.transformers.auto.tokenizer.FASTER_TOKENIZER_MAPPING_NAMES to see which faster tokenizers are currently supported.”
待切词文本长度过短(如文本平均长度小于5)。这种情况下切词开销可能不是整个文本预处理的性能瓶颈,导致在使用FasterTokenizer后仍无法提升整体性能。
5.1 方案一
把paddlenlp直接装到指定路径然后修改对应文件;
详情参考这个PR:
Add use_faster flag for uie of taskflow.
5.2方案二
直接找到pr修改后的版本,从giuhub拉去过来:链接参考
https://github.com/joey12300/PaddleNLP/tree/add_ft_requirements
from pprint import pprint
import json
from paddlenlp.taskflow import Taskflow
import pandas as pd
#运行时间
import time
def openreadtxt(file_name):
data = []
file = open(file_name,'r',encoding='UTF-8') #打开文件
file_data = file.readlines() #读取所有行
for row in file_data:
data.append(row) #将每行数据插入data中
return data
# 时间1
old_time = time.time()
data_input=openreadtxt('/home/aistudio/数据集/unlabeled_data-Copy1.txt')
few_ie = Taskflow("information_extraction", model="uie-data-distill-gp", task_path="/home/aistudio/data_distill/checkpoint2/model_best",use_faster=True,batch_size=32) # Schema 在闭域信息抽取中是固定的
# few_ie = Taskflow("information_extraction", model="uie-data-distill-gp", task_path="/home/aistudio/data_distill/checkpoint2/model_best",batch_size=32) # Schema 在闭域信息抽取中是固定的
# schema = {'疾病': ['手术治疗', '实验室检查', '影像学检查']}
# few_ie = Taskflow('information_extraction', schema=schema, batch_size=32,use_faster=True,task_path='/home/aistudio/checkpoint/model_best')
# few_ie = Taskflow('information_extraction', schema=schema, batch_size=32,task_path='/home/aistudio/checkpoint/model_best')
# 时间1
current_time = time.time()
print("数据模型载入运行时间为" + str(current_time - old_time) + "s")
#时间2
old_time1 = time.time()
results=few_ie(data_input)
current_time1 = time.time()
print("模型计算运行时间为" + str(current_time1 - old_time1) + "s")
#时间2
#时间三
old_time3 = time.time()
test = pd.DataFrame(data=results)
test.to_csv('/home/aistudio/output/reslut.txt', sep='\t', index=False,header=False) #本地
# with open("/home/aistudio/output/reslut.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
# for result in results:
# line = json.dumps(result, ensure_ascii=False) #对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
# f.write(line + "\n")
current_time3 = time.time()
print("数据导出运行时间为" + str(current_time3 - old_time3) + "s")
# for idx, text in enumerate(data):
# print('Data: {} \t Lable: {}'.format(text[0], results[idx]))
print("数据结果已导出")
5.3UIE FasterTokenizer加速,提升推理性能
数据样本增大为原来的三倍:unlabeled_data-Copy1.txt
UIE base
数据模型载入运行时间为1.6006419658660889s
模型计算运行时间为203.95947885513306s
数据导出运行时间为0.07103896141052246s
UIE base + FasterTokenizer
数据模型载入运行时间为1.6196515560150146s
模型计算运行时间为177.17986011505127s
数据导出运行时间为0.07898902893066406s
UIE蒸馏mini
数据模型载入运行时间为0.8441095352172852s
模型计算运行时间为21.979790925979614s
数据导出运行时间为0.02339339256286621s
UIE蒸馏mini + FasterTokenizer
数据模型载入运行时间为0.7269768714904785s
模型计算运行时间为20.155770540237427s
数据导出运行时间为0.012202978134155273s
6.总结
测试硬件情况:
1点算力卡对应的:
V100 32GB
GPUTesla V100
Video Mem32GB
CPU4 Cores
RAM32GB
Disk100GB
模型 | 模型计算运行时间 | precision | recall | F1 |
---|---|---|---|---|
uie-base | 68.61049008s | 0.69277 | 0.72327 | 0.70769 |
uie-mini | 28.932519437s | 0.74138 | 0.54088 | 0.62545 |
uie-micro | 26.36701917 | 0.74757 | 0.48428 | 0.58779 |
uie-nano | 24.8937761 | 0.74286 | 0.49057 | 0.59091 |
蒸馏mini | 6.839258904s | 0.7732 | 0.75 | 0.76142 |
蒸馏micro | 6.776990s | 0.78261 | 0.72 | 0.75 |
蒸馏nano | 6.6231770s | 0.7957 | 0.74 | 0.76684 |
模型计算运行时间:
模型 | 模型计算运行时间 | 提速x倍 |
---|---|---|
UIE base | 203.95947s | 1 |
UIE base + FasterTokenizer | 177.1798s | 1.15 |
UIE蒸馏mini | 21.97979s | 9.28 |
UIE蒸馏mini + FasterTokenizer | 20.1557s | 10.12 |
1.可以看出UIE蒸馏在小网络下,性能差不多可以按需选择。可能会在更大任务性能会更好点
2.这里uie-base等只简单运行了10个epoch,可以多训练会提升性能
3.一般学生模型会选择参数量比较小的,UIE蒸馏版是schema并行推理的,速度会比UIE快很多,特别是schema比较多以及关系抽取等需要多阶段推理的情况
1.FasterTokenizer加速,paddlenlp2.4.0版本目前还不支持,只要参考PR改下源码
2.封闭域UIE的话schema是固定的,可以在label_maps.json查看,目前支持实体抽取、关系抽取、观点抽取和事件抽取,句子级情感分类目前蒸馏还不支持
3.想要更快的推理换下学生模型的backbone就行
感谢
感谢paddlenlp工作人员@linjieccc的支持,接受了issue并创建了pull request:fix data distill for UIE #3231 https://github.com/PaddlePaddle/PaddleNLP/pull/3231
Add use_faster flag for uie of taskflow. #3194
展望:
后续对FasterTokenizer进行补充;以及研究一下UIE模型的量化、剪枝、NAS
项目链接:fork一下即可
UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能!
如果有图片缺失查看原项目
UIE_Slim满足工业应用场景,解决推理部署耗时问题,提升效能。的更多相关文章
- Paddle Inference推理部署
Paddle Inference推理部署 飞桨(PaddlePaddle)是集深度学习核心框架.工具组件和服务平台为一体的技术先进.功能完备的开源深度学习平台,已被中国企业广泛使用,深度契合企业应用需 ...
- 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验
移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...
- 解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题
解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题 在web.xml中添加如 ...
- 解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题
解决eclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题. 有时候是src/main/resources下面的,有时候是sr ...
- 解决nextjs部署到now上之后出现的“Unable to import module 'now__launcher'”错误
解决nextjs部署到now上之后出现的“Unable to import module 'now__launcher'”错误 这个错误是由于在next.config.js中直接引用了withLess ...
- 解决IIS部署网站引用woff/woff2/svg字体报404错误
一.问题 在IIS上部署网站,网页引用woff字体时,浏览器报“找不到woff.woff2字体”.“404”错误,不仅预设的字体加载不出来,还影响网页加载速度. 二.原因 IIS默认设置情况下不识别. ...
- 总结解决 Android-Studio 编译耗时(好久、太长)问题
首先通过搜索有关Android-Studio 编译耗时(好久.太长)问题的博客,速度确实有所改善. 一.暂时解决 Android-Studio 编译耗时(好久.太长)问题 本文链接:https://b ...
- PaddlePaddle推理部署
PaddlePaddle推理部署 飞桨推理产品简介 作为飞桨生态重要的一部分,飞桨提供了多个推理产品,完整承接深度学习模型应用的最后一公里. 整体上分,推理产品主要包括如下子产品 各产品在推理生态中的 ...
- 黄聪:解决Web部署 svg/woff/woff2字体 404错误
问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...
- disconf系列【2】——解决zk部署情况为空的问题
如下图所示,在安装完成之后,发现zk(zookeeper)部署情况为空. 注:承接上篇,环境未发生改变. 1.解决zk没有启动的问题 查看disconf日志,发现zk没有启动. 实际情况是:zk已经启 ...
随机推荐
- Mysql--JOIN连表查询
一.Join查询原理 MySQL内部采用了一种叫做 nested loop join(嵌套循环连接)的算法:通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表 ...
- 阿里云的“终端云化”实践,基于ENS进行边缘架构构建
终端无休止的更新迭代,是软件对计算资源的需求激增. 作者|王广芳 编辑|IMMENSE 终端云化:打破硬件的桎梏 近几年,"终端云化"技术开始规模化落地,其核心思想是"计 ...
- JSP开发模式(四种模式)
原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 学习编程开发少不了学习开发模式, JSP在创立至今有 \(4\) 种流行的开发模式: 包括 JS ...
- Codeforces Round #739 (Div. 3) 个人题解(A~F2)
比赛链接:Here 1560A. Dislike of Threes Description 找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数 直接枚举出前 1000 个符合条件的数 ...
- [Vue] Computed property "XXX" was assigned to but it has no setter.
阅读这篇文章:https://blog.csdn.net/weixin_34090562/article/details/91369638 全选,通过计算属性计算得来.结果报错Computed pro ...
- configmap 和 secret 概述
本篇文章是对 configmap 和 secret 的一个总结,详细信息可看 这里 1. configmap 和 secret 概述 在 container 的 image 中可通过 ENTRYPOI ...
- mysql 用户及用户权限管理命令总结-用户添加及添加权限
本文为博主原创,转载请注明出处: linux 使用root 用户登录mysql 1. 添加用户,并设置用户登录密码: 格式: create user user_name@'ip' identifie ...
- [转帖]是的你没看错,HTTP3来了
https://www.jianshu.com/p/288ce6a8ab88 简介 很多小伙伴可能还沉浸在HTTP1.1的世界无法自拔,但是时代的洪流已经带领我们来到了HTTP3的世界了.是的,你在桥 ...
- Jmeter学习之四_kingbaseV8R6数据库的简单验证
Jmeter学习之四_kingbaseV8R6数据库的简单验证 背景 周一没去报道, 因为我忘记体检了... 继续在家进行学习提高自己. jmeter周末时开始看的. 今天想着继续研究一下对数据库的处 ...
- [转帖]大模型训练,英伟达Turing、Ampere和Hopper算力分析
https://www.eet-china.com/mp/a219195.html 大 GPU 优势在于通过并行计算实现大量重复性计算.GPGPU即通用GPU,能够帮助 CPU 进行非图形相关程序的运 ...