前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用于发票识别的微调 Transformer 模型

用于发票识别的微调 Transformer 模型

作者头像
deephub
发布于 2021-07-23 07:08:31
发布于 2021-07-23 07:08:31
1.2K00
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:0
代码可运行

介绍

本片文章将介绍微软最新发布的Layout LM模型。在这里我们将展示从注释和预处理到训练和推理的整个过程。

Layout LM模型

LayoutLM 模型基于 BERT 架构,但具有两种附加类型的输入嵌入。第一个是二维位置嵌入,表示文档内令牌的相对位置,第二个是文档内扫描令牌图像的图像嵌入。该模型在多个下游任务中取得了最新的最新成果,包括表单理解(从 70.72 到 79.27)、收据理解(从 94.02 到 95.24)和文档图像分类(从 93.07 到 94.42)。有关更多信息,请参阅原始论文。

值得庆幸的是,该模型是开源的,并且可以在 Huggingface 库中使用。

在本教程中,我们将直接从 Huggingface 库中克隆模型,并在我们自己的数据集上对其进行微调。但首先,我们需要创建训练数据。

发票注释

使用 UBIAI 文本注释工具,我已经注释了大约 50 个个人发票。我有兴趣提取实体的键和值;例如,在下面的文本“日期:06/12/2021”中,我们将“日期”注释为 DATE_ID,将“06/12/2021”注释为 DATE。提取键和值将帮助我们将数值与其属性相关联。以下是所有已注释的实体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 DATE_ID, DATE, INVOICE_ID, INVOICE_NUMBER,SELLER_ID, SELLER, MONTANT_HT_ID, MONTANT_HT, TVA_ID, TVA, TTC_ID, TTC

以下是一些实体定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 MONTANT_HT: Total price pre-tax
 TTC: Total price with tax
 TVA: Tax amount

以下是使用 UBIAI 的带注释发票的示例:

注释后,我们直接以正确的格式从 UBIAI 导出训练和测试文件,无需任何预处理步骤。导出将包括每个训练和测试数据集的三个文件和一个包含所有名为 labels.txt 的标签的文本文件:

训练/测试.txt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 2018O
 Sous-totalO
 enO
 EURO
 3,20O
 €O
 TVAS-TVA_ID
 (0%)O
 0,00S-TVA
 TotalB-TTC_ID
 enI-TTC_ID
 EURE-TTC_ID
 3,20S-TTCO
 ServicesO
 soumisO
 auO
 mécanismeO
 d'autoliquidationO
 -O

Train/Test_box.txt(包含每个标记的边界框):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
912 457 920 466
 Services80 486 133 495
 soumis136 487 182 495
 au185 488 200 495
 mécanisme204 486 276 495
 d'autoliquidation279 486 381 497
 -383 490 388 492

Train/Test_image.txt(包含边界框、文档大小和名称):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
912 425 920 434 1653 2339 image1.jpg
 TVA 500 441 526 449 1653 2339  image1.jpg
 (0%) 529 441 557 451 1653 2339  image1.jpg
 0,00882 441 920 451 1653 2339  image1.jpg
 Total 500 457 531 466 1653 2339  image1.jpg
 en 534 459 549 466 1653 2339  image1.jpg
 EUR 553 457 578 466 1653 2339  image1.jpg
 3,20 882 457 911 467 1653 2339  image1.jpg
 € 912 457 920 466 1653 2339  image1.jpg
 Services 80 486 133 495 1653 2339  image1.jpg
 soumis 136 487 182 495 1653 2339  image1.jpg
 au 185 488 200 495 1653 2339  image1.jpg
 mécanisme 204 486 276 495 1653 2339  image1.jpg
 d'autoliquidation 279 486 381 497 1653 2339  image1.jpg
 - 383 490 388 492 1653 2339  image1.jpg

labels.txt:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 B-DATE_ID
 B-INVOICE_ID
 B-INVOICE_NUMBER
 B-MONTANT_HT
 B-MONTANT_HT_ID
 B-SELLER
 B-TTC
 B-DATE
 B-TTC_ID
 B-TVA
 B-TVA_ID
 E-DATE_ID
 E-DATE
 E-INVOICE_ID
 E-INVOICE_NUMBER
 E-MONTANT_HT
 E-MONTANT_HT_ID
 E-SELLER
 E-TTC
 E-TTC_ID
 E-TVA
 E-TVA_ID
 I-DATE_ID
 I-DATE
 I-SELLER
 I-INVOICE_ID
 I-MONTANT_HT_ID
 I-TTC
 I-TTC_ID
 I-TVA_ID
 O
 S-DATE_ID
 S-DATE
 S-INVOICE_ID
 S-INVOICE_NUMBER
 S-MONTANT_HT_ID
 S-MONTANT_HT
 S-SELLER
 S-TTC
 S-TTC_ID
 S-TVA
 S-TVA_ID

微调 LayoutLM 模型:

在这里,我们使用带有 GPU 的 google colab 来微调模型。下面的代码基于原始 layoutLM 论文和本教程。

首先,安装 layoutLM 包...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ! rm -r unilm
 ! git clone -b remove_torch_save https://github.com/NielsRogge/unilm.git
 ! cd unilm/layoutlm
 ! pip install unilm/layoutlm

...以及下载模型的Transformer包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ! rm -r transformers
 ! git clone https://github.com/huggingface/transformers.git
 ! cd transformers
 ! pip install ./transformers

接下来,创建一个包含来自 labels.txt 的唯一标签的列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from torch.nn import CrossEntropyLossdef get_labels(path):
     with open(path, "r") as f:
         labels = f.read().splitlines()
     if "O" not in labels:
         labels = ["O"] + labels
     return labels
 labels = get_labels("./labels.txt")
 num_labels = len(labels)
 label_map = {i: label for i, label in enumerate(labels)}
 pad_token_label_id = CrossEntropyLoss().ignore_index

然后,创建一个 pytorch 数据集和数据加载器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from transformers import LayoutLMTokenizer
 from layoutlm.data.funsd import FunsdDataset, InputFeatures
 from torch.utils.data import DataLoader, RandomSampler, SequentialSampler
 args = {'local_rank': -1,
         'overwrite_cache': True,
         'data_dir': '/content/data',
         'model_name_or_path':'microsoft/layoutlm-base-uncased',
         'max_seq_length': 512,
         'model_type': 'layoutlm',}
 # class to turn the keys of a dict into attributes
 class AttrDict(dict):
     def __init__(self, *args, **kwargs):
         super(AttrDict, self).__init__(*args, **kwargs)
         self.__dict__ = self
 args = AttrDict(args)
 tokenizer = LayoutLMTokenizer.from_pretrained("microsoft/layoutlm-base-uncased")
 # the LayoutLM authors already defined a specific FunsdDataset, so we are going to use this here
 train_dataset = FunsdDataset(args, tokenizer, labels, pad_token_label_id, mode="train")
 train_sampler = RandomSampler(train_dataset)
 train_dataloader = DataLoader(train_dataset,
                               sampler=train_sampler,
                               batch_size=2)
 eval_dataset = FunsdDataset(args, tokenizer, labels, pad_token_label_id, mode="test")
 eval_sampler = SequentialSampler(eval_dataset)
 eval_dataloader = DataLoader(eval_dataset,
                              sampler=eval_sampler,
                             batch_size=2)
 batch = next(iter(train_dataloader))
 input_ids = batch[0][0]
 tokenizer.decode(input_ids)

从 Huggingface 加载模型。这将在数据集上进行微调。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from transformers import LayoutLMForTokenClassification
 import torch
 device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
 model = LayoutLMForTokenClassification.from_pretrained("microsoft/layoutlm-base-uncased", num_labels=num_labels)
 model.to(device)

最后,开始训练:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from transformers import AdamW
 from tqdm import tqdm
 
 optimizer = AdamW(model.parameters(), lr=5e-5)
 global_step = 0
 num_train_epochs = 50
 t_total = len(train_dataloader) * num_train_epochs # total number of training steps
 #put the model in training mode
 model.train()
 for epoch in range(num_train_epochs):
   for batch in tqdm(train_dataloader, desc="Training"):
       input_ids = batch[0].to(device)
       bbox = batch[4].to(device)
       attention_mask = batch[1].to(device)
       token_type_ids = batch[2].to(device)
       labels = batch[3].to(device)
 # forward pass
       outputs = model(input_ids=input_ids, bbox=bbox, attention_mask=attention_mask, token_type_ids=token_type_ids,
                       labels=labels)
       loss = outputs.loss
 # print loss every 100 steps
       if global_step % 100 == 0:
         print(f"Loss after {global_step} steps: {loss.item()}")
 # backward pass to get the gradients 
       loss.backward()
 #print("Gradients on classification head:")
       #print(model.classifier.weight.grad[6,:].sum())
 # update
       optimizer.step()
       optimizer.zero_grad()
       global_step += 1

您应该能够看到训练进度和损失得到更新。

训练后,使用以下函数评估模型性能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import numpy as np
 from seqeval.metrics import (
     classification_report,
     f1_score,
     precision_score,
     recall_score,
 )
 
 eval_loss = 0.0
 nb_eval_steps = 0
 preds = None
 out_label_ids = None
 
 # put model in evaluation mode
 model.eval()
 for batch in tqdm(eval_dataloader, desc="Evaluating"):
     with torch.no_grad():
         input_ids = batch[0].to(device)
         bbox = batch[4].to(device)
         attention_mask = batch[1].to(device)
         token_type_ids = batch[2].to(device)
         labels = batch[3].to(device)
 # forward pass
         outputs = model(input_ids=input_ids, bbox=bbox, attention_mask=attention_mask, token_type_ids=token_type_ids,
                         labels=labels)
         # get the loss and logits
         tmp_eval_loss = outputs.loss
         logits = outputs.logits
 eval_loss += tmp_eval_loss.item()
         nb_eval_steps += 1
 # compute the predictions
         if preds is None:
             preds = logits.detach().cpu().numpy()
             out_label_ids = labels.detach().cpu().numpy()
         else:
             preds = np.append(preds, logits.detach().cpu().numpy(), axis=0)
             out_label_ids = np.append(
                 out_label_ids, labels.detach().cpu().numpy(), axis=0
             )
 # compute average evaluation loss
 eval_loss = eval_loss / nb_eval_steps
 preds = np.argmax(preds, axis=2)
 out_label_list = [[] for _ in range(out_label_ids.shape[0])]
 preds_list = [[] for _ in range(out_label_ids.shape[0])]
 for i in range(out_label_ids.shape[0]):
     for j in range(out_label_ids.shape[1]):
         if out_label_ids[i, j] != pad_token_label_id:
             out_label_list[i].append(label_map[out_label_ids[i][j]])
             preds_list[i].append(label_map[preds[i][j]])
 results = {
     "loss": eval_loss,
     "precision": precision_score(out_label_list, preds_list),
     "recall": recall_score(out_label_list, preds_list),
     "f1": f1_score(out_label_list, preds_list),
 }

只有 50 个文档,我们得到以下分数:

有了更多的注释,我们当然应该得到更高的分数。

最后,保存模型以供未来预测:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 PATH='./drive/MyDrive/trained_layoutlm/layoutlm_UBIAI.pt'
 torch.save(model.state_dict(), PATH)

推理

现在是有趣的部分,让我们上传发票,对其进行 OCR,并提取相关实体。对于此测试,我们使用了不在训练或测试数据集中的发票。为了解析发票中的文本,我们使用开源 Tesseract 包。让我们安装软件包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 !sudo apt install tesseract-ocr
 !pip install pytesseract

在运行预测之前,我们需要解析图像中的文本并将标记和边界框预处理为特征。为此,我创建了一个预处理 python 文件 layoutLM_preprocess.py,它可以更轻松地预处理图像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import sys
 sys.path.insert(1, './drive/MyDrive/UBIAI_layoutlm')
 from layoutlm_preprocess import *
 image_path='./content/invoice_test.jpg'
 image, words, boxes, actual_boxes = preprocess(image_path)

接下来,加载模型并使用其边界框获取单词预测:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 model_path='./drive/MyDrive/trained_layoutlm/layoutlm_UBIAI.pt'
 model=model_load(model_path,num_labels)
 word_level_predictions, final_boxes=convert_to_features(image, words, boxes, actual_boxes, model)

最后,显示带有预测实体和边界框的图像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 draw = ImageDraw.Draw(image)
 font = ImageFont.load_default()
 def iob_to_label(label):
   if label != 'O':
     return label[2:]
   else:
     return ""
 label2color = {'data_id':'green','date':'green','invoice_id':'blue','invoice_number':'blue','montant_ht_id':'black','montant_ht':'black','seller_id':'red','seller':'red', 'ttc_id':'grey','ttc':'grey','':'violet', 'tva_id':'orange','tva':'orange'}
 for prediction, box in zip(word_level_predictions, final_boxes):
     predicted_label = iob_to_label(label_map[prediction]).lower()
     draw.rectangle(box, outline=label2color[predicted_label])    
     draw.text((box[0] + 10, box[1] - 10), text=predicted_label, fill=label2color[predicted_label], font=font)
 image

虽然该模型也会有错误,例如将 TTC 标签分配给购买的物品或未识别某些 ID,但它能够正确提取卖家、发票编号、日期和 TTC。鉴于带注释的文档数量很少(只有 50 个),结果令人印象深刻且非常有希望!有了更多带注释的发票,我们将能够达到更高的 F 分数和更准确的预测。

总结

总体而言,LayoutLM 模型的结果非常有希望,并证明了 Transformer 在分析半结构化文本中的有用性。该模型可以在任何其他半结构化文件上进行微调,例如驾照、合同、政府文件、财务文件等。

如果你喜欢这篇文章,请点赞和分享!

本文作者:Walid Amamou

原文地址:https://towardsdatascience.com/fine-tuning-transformer-model-for-invoice-recognition-1e55869336d4

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
读PolarDB论文有感 : 异构计算和数据库软硬一体化设计
作者:熊中哲,现任才云科技工程VP,负责产品和研发工作。曾就职于阿里巴巴、沃趣科技、美团。超过12年数据库领域的工作经历,目前对云原生,机器学习和异构计算也很感兴趣。
用户1278550
2020/06/01
8930
2020年度20多款主流数据库重大更新及技术要点回顾
为方便阅读、重点呈现,本文对各板块内容进行了精简,需阅读完整版可点击文末【阅读原文】或登录云盘下载:https://pan.baidu.com/s/1h8plZz-amxxOMMWTL2eicQ(提取码:dwqg)
jeanron100
2021/02/25
1.8K0
2020年度20多款主流数据库重大更新及技术要点回顾
SIGMOD 2021 | 业务驱动背景下,腾讯云原生数据库TDSQL-C的技术演变之路
6月20-25日,数据库国际顶会2021 ACM SIGMOD在西安举行。本届大会上,腾讯云数据库技术总监邱敏带来了主题为“腾讯云数据库技术演变之路”的演讲。 演讲视频 以下为演讲内容的文字实录: 数据库是三大基础软件之一。近年来,腾讯也在不断加强各类数据库产品的研发投入。企业级分布式数据库TDSQL是腾讯云数据库的代表性产品,同时具备OLTP、OLAP,以及混合OLTP和OLAP的HTAP能力。它包括以下几个系列的产品: 企业级MySQL即腾讯云数据库RDS系统(CDB),相对原生MySQL进行
腾讯云数据库 TencentDB
2021/07/12
8580
数据库“焕然新生”:架构视角下,云原生数据库的创新实践 | Q推荐
从传统关系型数据库到云数据库,数据库在不断演进。与此同时,它也发挥着越来越重要的作用。从云计算、新媒体、音视频、云游戏到移动 App,几乎各行各业都离不开数据库。一方面,数据库作为 IT 基础设施的关键一环,对企业业务的发展起着支撑作用;另一方面,数字化在经济社会中不断深入,数据成为核心要素,围绕数据的生产、存储和消费均依赖数据库。
深度学习与Python
2022/11/28
7920
数据库“焕然新生”:架构视角下,云原生数据库的创新实践 | Q推荐
云原生数据库TDSQL-C PostgreSQL版内核解密
导语 TDSQL-C 原(CynosDB)是腾讯云数据库团队自研的新一代云原生数据库,融合了传统数据库、云计算与新硬件技术的优势,采用计算和存储分离的架构,100%兼容 PostgreSQL,提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。 本文旨在从数据库内核的角度揭秘TDSQL-C PostgreSQL的核心架构与关键技术。本文适合读者:腾讯云售后服务、TDSQL-C用户、TDSQL-C开发者,需要有基本的数据库与存储知识。 TDSQL-C 概述 TDSQL-C采用计算和存储分离的架构
腾讯云数据库 TencentDB
2021/09/26
2K0
数据库的下一场革命:S3 延迟已降至原先的 10%,云数据库架构该进化了
众所周知,在数据库的历史上,每次存储介质的变化都会引发软件的变革。从 SAN 存储到 SSD 到大内存到 NVM,都触发了数据库内核从理论到工程的演进。
深度学习与Python
2023/12/28
3420
数据库的下一场革命:S3 延迟已降至原先的 10%,云数据库架构该进化了
数据库漫谈(九)----云数据库
本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师 ,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db_perf ,经其本人授权发布。
SQLplusDB
2022/08/19
1.3K0
数据库漫谈(九)----云数据库
MYSQL 开始学习POLARDB for MYSQL (1)
不做铺垫,因为公司在进行数据库转型,ORACLE to MYSQL 基于云上的MYSQL 在使用中主要分为两派 1 传统型的RDS ,也就是与我们自己安装的数据库有差别,但差别不大, 2 根据云上的硬件环境,最大最充分的修改数据库的内部结构,让数据库更能使用到我们的硬件环境,去适配他。
AustinDatabases
2022/04/05
9070
MYSQL  开始学习POLARDB for MYSQL (1)
数据库如果多上云,DBA 还有什么发展
随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等,期待你的加入,加群请添加微信liuaustin3.
AustinDatabases
2023/02/28
4250
数据库如果多上云,DBA 还有什么发展
美国知名大学开授China数据库理论,你没看错!
Austindatabases公众号已经开启了,AI 文章分析,AI 文章问答,比如你想知道AustinDatabases 里面,说了多少种数据库,那些是讲 MySQL,那些是PostgreSQL, 那些是OB ,POLARDB ,MongoDB ,SQL Server, 阿里云的,问他他会列出来,同时如果有问题不明白,可以将文章的文字粘贴到公众号提供的专用AI ,公众号将通过众多文章(目前1300多篇)来进行尝试性的解释。使用方法,直接到微信公众号中点击服务,选择AI问答。如下示例
AustinDatabases
2025/04/09
490
美国知名大学开授China数据库理论,你没看错!
相比原生,腾讯云数据库MySQL 8.0带来了哪些新的极致体验?
官方MySQL 8.0 是非常大的版本,以前的版本号是 5.6、5.7,现在一下飞跃到 8.0,对于 Oracle MySQL官方来说也是非常大的版本,有很多的更新。
腾讯云开发者
2020/08/20
5.6K2
Amazon Aurora:云时代的数据库 ( 上)
导语:文章是 Amazon 在SIGMOD'17 上最新发表的关于 Aurora论文的翻译版本,详尽的介绍了 Aurora 设计背后的驱动和思考,以及如何在云上实现一个同时满足高并发、高吞吐量、高稳定
谭伟华)
2017/08/02
5.9K0
Amazon Aurora:云时代的数据库 ( 上)
TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库
TDSQL-C采用计算和存储分离的架构,所有计算节点共享一份数据,存储容量高达128TB,单库最高可扩展至16节点,提供秒级的配置升降级、秒级的故障恢复和数据备份容灾服务。TDSQL-C既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自我迭代的优势。TDSQL-C不仅在性能、扩展性和高可用方面有大幅提升,计算存储的解耦使得计算层和存储层都获得了很大的独立优化空间,本文下面将介绍TDSQL-C架构的实现,以及在新架构上的关键技术优势。
腾讯云数据库 TencentDB
2021/09/17
1K0
云原生数据库设计新思路
在讲新的思路之前,先为过去没有关注过数据库技术的朋友们做一个简单的历史回顾,接下来会谈谈未来的数据库领域,在云原生数据库设计方面的新趋势和前沿思考。首先来看看一些主流数据库的设计模式。
PingCAP
2021/01/14
1.7K0
分布式数据库创新技术奖,TDSQL他来了!
日前,Distributed Cloud|2021全球分布式云大会·上海站隆重召开。腾讯云凭借其信息技术系统的安全可控性和前沿技术的创新性,在一众企业中脱颖而出,荣获“分布式数据库创新技术奖”。这是继腾讯云数据库TDSQL获第四届中国保险大数据分析与人工智能创新国际峰会年度“保险创新者大奖”之后再次获评。 在云原生专题论坛上,腾讯云数据库产品专家梁文灿先生就腾讯云企业级分布式数据库TDSQL生态发展战略、落地应用案例做出了详细介绍。同时腾讯云数据库专家工程师张远先生对云原生数据库TDSQL-C的内核关键技
腾讯云数据库 TencentDB
2021/09/22
1.3K0
开发者关注的数据库技术与创新
说到这个问题的话,那么从PolarDB入手来说,作为开发者关注的数据库技术与创新基本就在里面了。 PolarDB MySQL版是阿里巴巴自研的云原生HTAP数据库。PolarDB MySQL版100%兼容原生MySQL的多个版本,包括MySQL 5.6、MySQL 5.7和MySQL 8.0。PolarDB MySQL版的企业版基于云原生架构、计算存储分离、软硬件一体化设计,为用户提供具备超高弹性和性能、高可用和高可靠保障、高性价比的数据库服务。可以说关于数据库技术和创新,云原生数据库PolarDB 体现的很全面了,下面看一下云原生数据库PolarDB的产品架构图
六月的雨在Tencent
2024/04/08
1620
开发者关注的数据库技术与创新
(文中有惊喜)走进云时代的数据库
最近几年,随着云计算相关技术的发展,各种不同类型的云层出不穷,服务越来越多不同类型的企业业务,传统企业也渐渐开始探索上云的道路。在云上,作为业务最核心的数据库,相比之前的传统方案会有哪些变化呢?
数据和云
2018/12/07
1.1K0
在阿里达摩院搞了四年数据库,我来聊聊实际情况 | 卓越技术团队访谈录
嘉宾 | 汪晟、谭剑、谢炯 编辑 | 钰莹 2017 年的云栖大会,阿里巴巴达摩院宣布成立。 5 大研究方向,16 个实验室,数据库与存储实验室便是达摩院下设实验室之一。 成立伊始,达摩院定位发力硬核基础科技。 前沿数据库技术,就是发力方向之一。 五年时间,社交媒体上每隔一段时间就有人出来问“阿里达摩院搞出来什么成果了?”,“阿里达摩院的技术水平是什么样的?”,“达摩院里面的人平常的 KPI 是什么?”,“什么样的人可以进阿里达摩院?”...... InfoQ 日前对达摩院数据库与存储实验室的三个核心
深度学习与Python
2023/03/29
8650
在阿里达摩院搞了四年数据库,我来聊聊实际情况 | 卓越技术团队访谈录
腾讯云数据库CDB技术演进之路
作者简介:程彬,腾讯基础架构部数据库研发负责人。2008年毕业加入腾讯,一直从事数据存储相关研发工作;在云计算浪潮涌来之时参与到腾讯云存储产品的打造。目前在腾讯TEG基础架构部,负责数据库(CDB)和云硬盘(CBS)研发相关工作。
腾讯 架构师
2021/07/15
2.2K0
腾讯云数据库CDB技术演进之路
MySQL痿了,放不下这么多数据!
MySQL在达到一定数据量(我的经验是3T、单表1亿)时,复杂查询会有明显的延迟。继续分库分表,会严重增加业务复杂性,尤其对很多非互联网产品来说,急需一个分布式存储。
xjjdog
2019/07/10
1.2K0
MySQL痿了,放不下这么多数据!
推荐阅读
相关推荐
读PolarDB论文有感 : 异构计算和数据库软硬一体化设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档