写点什么

KDD Cup 2020 多模态召回比赛亚军方案与搜索业务应用

  • 2020-10-06
  • 本文字数:8198 字

    阅读完需:约 27 分钟

KDD Cup 2020多模态召回比赛亚军方案与搜索业务应用

ACM SIGKDD(ACM SIGKDD Conference on Knowledge Discovery and Data Mining)是世界数据挖掘领域的顶级国际会议。今年,KDD Cup 共设置四个赛道共五道赛题,涉及数据偏差问题(Debiasing)、多模态召回(Multimodalities Recall)、自动化图学习(AutoGraph)、对抗学习问题和强化学习问题。

美团搜索广告算法团队最终在Debiasing赛道中获得冠军(1/1895),在AutoGraph赛道中也获得了冠军(1/149)。在Multimodalities Recall赛道中,亚军被美团搜索与 NLP 团队摘得(2/1433),而季军被美团搜索广告算法团队收入囊中(3/1433)。

本文将介绍多模态召回比赛亚军的技术方案,以及在美团搜索业务中的应用与实践,希望能给从事相关工作的同学带来一些帮助或者启发。

1. 背景

跟其它电商公司一样,美团业务场景中除了文本,还存在图片、动图、视频等多种模态信息。同时,美团搜索是典型的多模态搜索引擎,召回和排序列表中存在 POI、图片、文本、视频等多种模态结果,如何保证 Query 和多模态搜索结果的相关性面临着很大的挑战。


鉴于多模态召回赛题(Multimodalities Recall)和美团搜索业务的挑战比较类似,本着磨炼算法基本功和沉淀相关技术能力的目的,美团搜索与 NLP 组建团队参与了该项赛事,最终提出的“基于 ImageBERT 和 LXMERT 融合的多模态召回解决方案”最终获得了第二名(2/1433)(KDD Cup2020 Recall榜单)。本文将介绍多模态召回赛题的技术方案,以及多模态技术在美团搜索场景中的落地应用。


相关代码已经在 GitHub 上开源:


https://github.com/zuokai/KDDCUP_2020_MultimodalitiesRecall_2nd_Place



图 1 KDD Cup 2020 Multimodalities Recall 比赛 TOP 10 榜单

2. 赛题简介

2019 年,全球零售电子商务销售额达 3.53 万亿美元,预计到 2022 年,电子零售收入将增长至 6.54 万亿美元。如此快速增长的业务规模表明了电子商务行业的广阔发展前景,但与此同时,这也意味着日益复杂的市场和用户需求。随着电子商务行业规模的不断增长,与之相关的各个模态数据也在不断增多,包括各式各样的带货直播视频、以图片或视频形式展示的生活故事等等。新的业务和数据都为电子商务平台的发展带来了新的挑战。


目前,绝大多数的电子商务和零售公司都采用了各种数据分析和挖掘算法来增强其搜索和推荐系统的性能。在这一过程中,多模态的语义理解是极为重要的。高质量的语义理解模型能够帮助平台更好的理解消费者的需求,返回与用户请求更为相关的商品,能够显著的提高平台的服务质量和用户体验。



在此背景下,今年的 KDD Cup 举办了多媒体召回任务(Modern E-Commerce Platform: Multimodalities Recall),任务要求参赛者根据用户的查询 Query,对候选集合中的所有商品图片进行相关性排序,并找出最相关的 5 个商品图片。举例说明如下:


如下图 2 所示,用户输入的 Query 为:


leopard-print women's shoes
复制代码


根据其语义信息,左侧图片与查询 Query 是相关的,而右侧的图片与查询 Query 是不相关的。



图 2 多模态匹配示意图


从示例可以看出,该任务是典型的多模态召回任务,可以转化为 Text-Image Matching 问题,通过训练多模态召回模型,对 Query-Image 样本对进行相关性打分,然后对相关性分数进行排序,确定最后的召回列表。

2.1 比赛数据

本次比赛的数据来自淘宝平台真实场景下用户 Query 以及商品数据,包含三部分:训练集(Train)、验证集(Val)和测试集(Test)。根据比赛阶段的不同,测试集又分为 testA 和 testB 两个部分。数据集的规模、包含的字段以及数据样例如表 1 所示。真实样本数据不包含可视化图片,示例图是为了阅读和理解的便利。



表 1 比赛数据集详情


在数据方面,需要注意的点有:


  • 训练集(Train)每条数据代表相关的 Query-Image 样本对,而在验证集(Val)和测试集(Test)中,每条 Query 会有多张候选图片,每条数据表示需要计算相关性的 Query-Image 样本对。

  • 赛事主办方已经对所有图片通过目标检测模型(Faster-RCNN)提取了多个目标框,并保存了目标框相应的 2048 维图像特征。因此,在模型中无需再考虑图像特征的提取。

2.2 评价指标

本次比赛采用召回 Top 5 结果的归一化折损累计增益(Normalized Discounted Cumulative Gain,NDCG@5)来作为相关结果排序的评价指标。

3. 经典解法

本次比赛需要解决的问题可以转化为 Text-Image Matching 任务,即对每一个 Query-Image 样本对进行相似性打分,进而对每个 Query 的候选图片进行相关度排序,得到最终结果。多模态匹配问题通常有两种解决思路:


  1. 将不同模态数据映射到不同特征空间,然后通过隐层交互这些特征学习到一个不可解释的距离函数,如图 3 (a)所示。

  2. 将不同模态数据映射到同一特征空间,从而计算不同模态数据之间的可解释距离(相似度),如图 3 (b)所示。



图 3 常用的多模态匹配解决思路


一般而言,同等条件下,由于图文特征组合后可以为模型隐层提供更多的交叉特征信息,因而左侧的模型效果要优于右侧的模型,所以在后续的算法设计中,我们都是围绕图 3 左侧的解决思路展开的。


随着 Goolge BERT 模型在自然语言处理领域的巨大成功,在多模态领域也有越来越多的研究人员开始借鉴 BERT 的预训练方法,发展出融合图片/视频(Image/Video)等其他模态的 BERT 模型,并成功应用与多模态检索、VQA、Image Caption 等任务中。因此,考虑使用 BERT 相关的多模态预训练模型(Vision-Language Pre-training, VLP),并将图文相关性计算的下游任务转化为图文是否匹配的二分类问题,进行模型学习。


目前,基于 Transformer 模型的多模态 VLP 算法主要分为两个流派:


  • 单流模型,在单流模型中文本信息和视觉信息在一开始便进行了融合,直接一起输入到 Encoder(Transformer)中。典型的单流模型如 ImageBERT [3],VisualBERT [9]、VL-BERT [10] 等。

  • 双流模型,在双流模型中文本信息和视觉信息一开始先经过两个独立的 Encoder(Transformer)模块,然后再通过 Cross Transformer 来实现不同模态信息的融合。典型的双流模型如 LXMERT [4],ViLBERT [8] 等。

4. 我们的方法:Transformer-Based Ensembled Models TBEM

本次比赛中,在算法方面,我们选用了领域最新的基于 Transformer 的 VLP 算法构建模型主体,并加入了 Text-Image Matching 作为下游任务。除了构建模型以外,我们通过数据分析来确定模型参数,构建训练数据。在完成模型训练后,通过结果后处理策略来进一步提升算法效果。整个算法的流程如下图 4 所示:



图 4 算法流程图


接下来对算法中的每个环节进行详细说明。

4.1 数据分析 &处理

数据分析和处理主要基于以下三个方面考虑:


  • 正负样本构建 :由于主办方提供的训练数据中,只包含了相关的 Query-Image 样本对,相当于只有正样本数据,因此需要通过数据分析,设计策略构建负样本。

  • 模型参数设定 :在模型中,图片目标框最大数量、Query 文本最大长度等参数需要结合训练数据的分布来设计。

  • 排序结果后处理 :通过分析 Query 召回的图片数据分布特点,确定结果后处理策略。


常规的训练数据生成策略为:对于每一个 Batch 的数据,按照 1:1 的比例选择正负样本。其中,正样本为训练集(Train)中的原始数据,负样本通过替换正样本中的 Query 字段产生,替换的 Query 是按照一定策略从训练集(Train)中获取。


为了提升模型学习效果,我们在构建负样本的过程中进行了难例挖掘,在构造样本时,通过使正负样本的部分目标框包含同样的类别标签,从而构建一部分较为相似的正负样本,以提高模型对于相似的正负样本的区分度。


难例挖掘的过程如下图 5 所示,左右两侧的相关样本对都包含了“shoes”这一类别标签,使用右侧样本对的 Query 替换左侧图片的 Query,从而构建难例。通过学习这类样本,能够提高模型对于不同类型“shoes”描述的区分度。



图 5 难例挖掘过程示意图


具体而言,负样本构建策略如表 2 所示:



表 2 负样本 Query 抽取策略


其次,通过对训练数据中目标框的个数以及 Query 长度的分布情况分析,确定模型的相关参数。图片中目标框的最大个数设置为 10,Query 文本的最大单词个数为 20。后处理策略相关的内容,我们将会在 4.3 部分进行详细的介绍。

4.2 模型构建与训练

4.2.1 模型结构

基于上文中对多模态检索领域现有方法的调研,在本次比赛中,我们分别从单流模型和双流模型中各选择了相应 SOTA 的算法,即 ImageBERT 和 LXMERT。具体而言,针对比赛任务,两种算法分别进行了如下改进:


LXMERT 模型方面主要的改进包括:


  • 图片特征部分(Visual Feature)融入了目标框类别标签所对应的文本特征。

  • Text-Image Matching Task 中使用两层全连接网络进行图片和文本融合特征的二分类,其中第一个全连接层之后使用 GeLU [2] 进行激活,然后通过 LayerNorm [1] 进行归一化处理。

  • 在第二个全连接层之后采用 Cross Entropy Loss 训练网络。


改进后的模型结构如下图 6 所示:



图 6 比赛中使用的 LXMERT 模型结构


特征网络的预训练权重使用了 LXMERT 所提供权重文件,下载地址为:https://github.com/airsplay/lxmert


ImageBERT :本方案中一共用到了两个版本的 ImageBERT 模型,分别记为 ImageBERT A 和 ImageBERT B,下面会分别介绍改进点。


ImageBERT A :基于原始 ImageBERT 的改进有以下几点。


  • 训练任务 :不对图片特征和 Query 的部分单词做掩码,仅训练相关性匹配任务,不进行 MLM 等其他任务的训练。

  • Segment Embedding :将 Segment Embedding 统一编码为 0,不对图片特征和 Query 文本单独进行编码。

  • 损失函数 :在[CLS]位输出 Query 与 Image 的匹配关系,通过 Cross Entropy Loss 计算损失。


依据上述策略,选用 BERT-Base 模型权重对变量初始化,在此基础上进行 FineTune。其模型结构如下图 7 所示:



图 7 比赛中使用的 ImageBert 模型结构


ImageBERT B :和 ImageBERT A 的不同点是在 Position Embedding 和 Segment Embedding 的处理上。


  • Position Embedding :去掉了 ImageBert 中图像目标框位置信息的 Position Embedding 结构。

  • Segment Embedding :文本的 Segment Embedding 编码为 0,图片特征的 Segment Embedding 编码为 1。


依据上述策略,同样选用 BERT-Base 模型权重对变量初始化,在此基础上进行 FineTune。


三种模型构建中,共性的创新点在于,在模型的输入中引入了图片目标框的标签信息。而这一思路同样被应用在了微软 2020 年 5 月份最新的论文 Oscar [7] 中,但该文的特征使用方式和损失函数设置与我们的方案不同。

4.2.2 模型训练

使用节 4.1 的数据生成策略构建训练数据,分别对上述三个模型进行训练,训练后的模型在验证集(Val)上的效果如表 3 所示。



表 3 初步训练后模型在验证集(Val)上的效果

4.2.3 利用损失函数进行模型微调

完成初步的模型训练后,接下来使用不同的损失函数对模型进行进一步的微调,主要有 AMSoftmax Loss [5]、Multi-Similarity Loss [6]。


  • AMSoftmax Loss 通过权值归一化和特征归一化,在缩小类内距离的同时增大类间距离,从而提高了模型效果。

  • Multi-Similarity Loss 将深度度量学习转化为样本对的加权问题,采用采样和加权交替迭代的策略实现了自相似性,负相对相似性和正相对相似性三种,能够促使模型学习得到更好的特征。


在我们的方案中所采用的具体策略如下:


  • 对于 LXMERT,在特征网络后加入 Multi-Similarity Loss,与 Cross Entropy Loss 组成多任务学习网络,进行模型微调。

  • 对于 ImageBERT A,使用 AMSoftmax Loss 代替 Cross Entropy Loss。

  • 对于 ImageBERT B,损失函数处理方式和 LXMERT 一致。


经过微调,各模型在验证集(Val)上的效果如表 4 所示。



表 4 损失函数对模型微调--验证集(Val)上的效果

4.2.4 通过数据过采样进行模型微调

为了进一步提高模型效果,本方案根据训练集(Train)中 Query 字段与测试集(testB)中的 Query 字段的相似程度,对训练集(Test)进行了过采样,采样规则如下:


  • 对 Query 在测试集(testB)中出现的样本,或与测试集(testB)中的 Query 存在包含关系的样本,根据其在训练集(Train)出现的次数,按照反比例进行过采样。

  • 对 Query 未在测试集(testB)中出现的样本,根据两个数据集 Query 中重复词的个数,对测试集(testB)每条 Query 抽取重复词数目 Top10 的训练集(Train)样本,每条样本过采样 50 次。


数据过采样后,分别对与上述的三个模型按照如下方案进行微调:


  • 对于 LXMERT 模型,使用过采样得到的训练样本对 LXMERT 模型进行进一步微调。

  • 对于 ImageBERT A 模型,本方案从训练集(Train)选出 Query 中单词和测试集(Test)Query 存在重合的样本对模型进行进一步微调。

  • 对于 ImageBERT B 模型,考虑到训练集(Train)中存在 Query 表达意思相同,但是单词排列顺序不同的情况,类似"sporty men’s high-top shoes"和"high-top sporty men’s shoes",为了增强模型的鲁棒性,以一定概率对 Query 的单词(Word)进行随机打乱,对 ImageBERT B 模型进行进一步微调。


训练后各模型在验证集(Val)上的效果如表 5 所示:



表 5 过采样后验证集(Val)集上的效果


为了充分利用全部有标签的数据,本方案进一步使用了验证集(Val)对模型进行 FineTune。为了避免过拟合,最终提交结果只对 ImageBERT A 模型进行了上述操作。


在 Query-Image 样本对的相关性的预测阶段,本方案对测试集(testB)Query 所包含的短句进行统计,发现其中“sen department” 这一短句在测试集(testB)中大量出现,但在训练集(Train)中从未出现,但出现过“forest style”这个短句。为了避免这组同义短句对模型预测带来的影响,选择将测试集(testB)中 Query 的“sen department”替换为“forest style”,并且利用 ImageBERT A 对替换后的测试集进行相关性预测,结果记为 ImageBERT A’。

4.3 模型融合和后处理

经过上述的模型构建、训练以及预测,本方案共得到了 4 个样本对相关性得分的文件。接下来对预测结果进行 Ensemble,并按照一定策略进行后处理,得到 Query 相应的 Image 候选排序集合,具体步骤如下:


(1)在 Ensemble 阶段,本方案选择对不同模型所得相关性分数进行加权求和,作为每一个样本对的最终相关性得分,各模型按照 LXMERT、ImageBERT A、ImageBERT B、ImageBERT A’的顺序的权值为 0.3:0.2:0.3:0.2,各模型的权重利用网格搜索的方式确定,通过遍历 4 个模型的不同权重占比,每个模型权重占比从 0 到 1,选取在 valid 集上效果最优的权重,进行归一化,作为最终权重。


(2)在得到所有 Query-Image 样本对的相关性得分之后,接下来对 Query 所对应的多张候选图片进行排序。验证集(Val)和测试集(testB)的数据中,部分 Image 出现在了多个 Query 的候选样本中,本方案对这部分样本做了进一步处理:


a.考虑到同一 Image 通常只对应一个 Query,因此认为同一个 Image 只与相关性分数最高的 Query 相关。使用上述策略对 ImageBERT B 模型在验证集(Val)上所得结果进行后处理,模型的 NDCG@5 分数从 0.7098 提升到了 0.7486。


b.考虑到同一 Image 对应的多条 Query 往往差异较小,其语义也是比较接近的,这导致了训练后的模型对这类样本的区分度较差,较差区分度的相关性分数会一定程度上引起模型 NDCG@5 的下降。针对这种情况我们采用了如下操作:


  • 如果同一 Query 的相关性分数中,Top1 Image 和 Top2 Image 相关性分数之差大于一定阈值,计算 NDCG@5 时则只保留 Top 1 所对应的 Query-Image 样本对,删除其他样本对。

  • 相反的,如果 Top1 Image 和 Top2 Image 相关性分数之差小于或等于一定阈值,计算 NDCG@5 时,删除所有包含该 Image 的样本对。


使用上述策略对 ImageBERT B 的验证集(Val)结果进行后处理,当选定阈值为 0.92 时,模型的 NDCG@5 分数从 0.7098 提升到了 0.8352。


可以看到,采用策略 b 处理后,模型性能得到了显著提升,因此,本方案在测试集(testB)上,对所有模型 Ensemble 后的相关性得分采用了策略 b 进行处理,得到了最终的相关性排序。

5. 多模态在美团搜索的应用

前面提到过,美团搜索是典型的多模态搜索场景,目前多模态能力在搜索的多个场景进行了落地。介绍具体的落地场景前,先简单介绍下美团搜索的整体架构,美团整体搜索架构主要分为五层,分别为:数据层、召回层、精排层、小模型重排层以及最终的结果展示层,接下来按照搜索的五层架构详细介绍下搜索场景中多模态的落地。


数据层


多模态表示 :基于美团海量的文本和图像/视频数据,构建平行语料,进行 ImageBERT 模型的预训练,训练模型用于提取文本和图片/视频向量化表征,服务下游召回/排序任务。


多模态融合 :图片/视频数据的多分类任务中,引入相关联的文本,用于提升分类标签的准确率,服务下游的图片/视频标签召回以及展示层按搜索 Query 出图。


召回层


多模态表示 &融合 :内容搜索、视频搜索、全文检索等多路召回场景中,引入图片/视频的分类标签召回以及图片/视频向量化召回,丰富召回结果,提升召回结果相关性。


精排层 &小模型重排


多模态表示 &融合:排序模型中,引入图片/视频的向量化 Embedding 特征,以及搜索 Query 和展示图片/视频的相关性特征、搜索结果和展示图片/视频的相关性特征,优化排序效果。


展示层


多模态融合:图片/视频优选阶段,引入图片/视频和 Query 以及和搜索结果的相关性信息,做到按搜索 Query 出图以及搜索结果出图,优化用户体验。



图 8 多模态在美团搜索的落地场景

6. 总结

在本次比赛中,我们构建了一种基于 ImageBERT 和 LXMERT 的多模态召回模型,并通过数据预处理、结果融合以及后处理策略来提升模型效果。该模型能够细粒度的对用户查询 Query 的相关图片进行打分排序,从而得到高质量的排序列表。通过本次比赛,我们对多模态检索领域的算法和研究方向有了更深的认识,也借此机会对前沿算法的工业落地能力进行了摸底测试,为后续进一步的算法研究和落地打下了基础。此外,由于本次比赛的场景与美团搜索与 NLP 部的业务场景存在一定的相似性,因此该模型未来也能够直接为我们的业务赋能。


目前,美团搜索与 NLP 团队正在结合多模态信息,比如文本、图像、OCR 等,开展 MT-BERT 多模态预训练工作,通过融合多模态特征,学习更好的语义表达,同时也在尝试落地更多的下游任务,比如图文相关性、向量化召回、多模态特征表示、基于多模态信息的标题生成等。


参考文献


[1] Ba, J. L., Kiros, J. R., and Hinton, G. E. Layer Normalization. arXiv preprint arXiv:1607.06450 (2016).


[2] Hendrycks, D., and Gimpel, K. Gaussian Error Linear Units (GeLUs). arXiv preprint arXiv:1606.08415 (2016).


[3] Qi, D., Su, L., Song, J., Cui, E., Bharti, T., and Sacheti, A. Imagebert: Cross-modal Pre-training with Large-scale Weak-supervised Image-text Data. arXiv preprint arXiv:2001.07966 (2020).


[4] Tan, H., and Bansal, M. LXMERT: Learning Cross-modality Encoder Representations from Transformers. arXiv preprint arXiv:1908.07490 (2019).


[5] Wang, F., Liu, W., Liu, H., and Cheng, J. Additive Margin Softmax for Face Verification. arXiv preprint arXiv:1801.05599 (2018).


[6] Wang, X., Han, X., Huang, W., Dong, D., and Scott, M. R. Multi-similarity Loss with General Pair Weighting for Deep Metric Learning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (2019), pp. 5022–5030.


[7] Li X, Yin X, Li C, et al. Oscar: Object-semantics aligned pre-training for vision-language tasks[J]. arXiv preprint arXiv:2004.06165, 2020.


[8] Lu J, Batra D, Parikh D, et al. Vilbert: Pretraining task-agnostic visiolinguistic representations for vision-and-language tasks[C]//Advances in Neural Information Processing Systems. 2019: 13-23.


[9] Li L H, Yatskar M, Yin D, et al. Visualbert: A simple and performant baseline for vision and language[J]. arXiv preprint arXiv:1908.03557, 2019.


[10] Su W, Zhu X, Cao Y, et al. Vl-bert: Pre-training of generic visual-linguistic representations[J]. arXiv preprint arXiv:1908.08530, 2019.


[11] 杨扬、佳昊等. MT-BERT的探索和实践.


作者介绍


左凯,马潮,东帅,曹佐,金刚,张弓等,均来自美团 AI 平台搜索与 NLP 部。


本文转载自公众号美团技术团队(ID:meituantech)。


原文链接


KDD Cup 2020多模态召回比赛亚军方案与搜索业务应用


2020-10-06 14:002064

评论

发布
暂无评论
发现更多内容

MASA Framework - DDD设计(2)

MASA技术团队

C# .net .net core 框架 Framework

docker的DNS配置说明

Geek_f24c45

Docker Kubernetes

无人驾驶全家桶:机场“人货场”的改造之路

脑极体

Metasploit 如何使用Exploits(漏洞)

喀拉峻

网络安全

外包学生管理系统架构设计文档

风中奇缘

架构实战课 「架构实战营」

选轻量应用服务器还是云服务器ECS?一图彻底搞懂

阿里云弹性计算

轻量应用 玩转ECS

千万级学生管理系统考试试卷存储方案

唐尤华

架构实战营

视频回顾|Pulsar Summit Asia 2021,案例、运维、生态干货不断

Apache Pulsar

开源 云原生 Apache Pulsar 社区 Pulsar Summit Asia 2021

APK修改神器:插桩工具 DexInjector

字节跳动终端技术

android 字节跳动 编译 APK 火山引擎MARS

Go 语言快速入门指南:Go 模板介绍

宇宙之一粟

Go 语言 2月月更

生态扩大进行中!Apache APISIX 支持 Azure Functions 集成

API7.ai 技术团队

microsoft azure API网关 Apache APISIX

外包学生管理系统架构设计文档

李大虾

#架构实战营 「架构实战营」

案例实践|Apache Pulsar 在移动云智能运维平台的实践

Apache Pulsar

开源 架构 云原生 Apache Pulsar Pulsar Summit Asia 2021

学生管理系统架构

Geek_f3e842

「架构实战营」

剑指Offer——全方位、多角度掌握企业级开发框架J2EE

No Silver Bullet

jdk8 offer 2月月更 J2EE

uni-app 模拟机调试环境搭建

编程三昧

uni-app 前端 开发工具 2月月更

与阿里云容器服务 ACK 发行版的深度对话第一弹:如何借助 sealer 实现快速构建 & 部署

阿里巴巴云原生

阿里云 容器 云原生 ACK Distro sealer

安全领域权限模型

alibeer

来看看字节跳动内部的数据血缘用例与设计

字节跳动数据平台

大数据 字节跳动 数据血缘

外包学生管理系统的架构文档

张逃逃

如何在Linux解压缩(打开)Gz 文件?

Ethereal

Blinn-Phong反射模型

CRMEB

Apache APISIX 集成 Kafka 实现高效率实时日志监控

API7.ai 技术团队

kafka 开源 日志 网关 Apache APISIX

架构训练营 第三模块作业-外包学生管理系统详细架构设计文档

Geek_16d2b8

架构训练营5期

Logo小变动,心境大不同,SVG矢量动画格式网站Logo图片制作与实践教程(Python3)

刘悦的技术博客

前端 动画 SVG Python3 svg图

Apache APISIX 集成 Google Cloud Logging

API7.ai 技术团队

Google 网关 APISIX Google Cloud

Netty入门 -- 什么是Netty?

Bug终结者

Java Netty 网络

Linux基础操作:如何在 Linux 中复制文件夹?

Ethereal

Linux系统数据备份不再头疼,Rdiff-backup来帮忙!

Ethereal

Linux 示例中的 apt 命令大全,建议收藏!

Ethereal

从中心走向边缘——深度解析云原生边缘计算落地痛点

阿里巴巴云原生

阿里云 Kubernetes 云原生 边缘计算

KDD Cup 2020多模态召回比赛亚军方案与搜索业务应用_开源_左凯_InfoQ精选文章