万物皆可嵌入--embedding在GPU中的实现

摘要

Embedding技术自从谷歌推出word2vec的工作后得到迅速的应用,典型应用之一是在广告推荐场景中,从word2vec演进到item2vec,embedding技术的出现也使深度学习进入广告推荐的场景成为可能。广告推荐模型动辄几十GB甚至TB的模型大小,高效地进行embedding table的操作成为影响性能的关键,本文将介绍embedding的相关知识背景,并以Nvidia推出的面向广告场景的HugeCTR框架为基础,介绍在GPU中关于embedding操作的实现。

Embedding介绍

一般而言,嵌入表(Embedding table)是指将一系列不同的元素,比如单词、短语或者句子,使用不同的方法提取到的特征向量矩阵。从数学表达上看,embedding是一种空间映射,将高维的向量表达映射到低维的向量表达。以单词的embedding表达为例,将每个单词使用one-hot(向量中只有一个元素非0)的方式表达,那么就是将单词的one-hot空间表达映射到新的特征向量空间。假设有一个句子“The cat sat on the mat”, 一共5个单词,对于cat的表达选择使用向量[1, 0, 0, 0, 0],经过embedding的操作变为图1中右图的维度为4的嵌入表,cat变为向量[1.2,-0.1, 4.3, 3.2],称之为特征向量,转换的过程即为训练的过程。总而言之,embedding就是用一个低维的向量(数学的方式)表示一个物品,可以是商品、人或者单词,所以从表达范畴上讲万物皆可采用embedding表示[1]。

图片

图1 one-hot encoder到嵌入表的转换[2]

显而易见,使用one-hot的编码带来的问题之一是数据量巨大且稀疏,如图1,使用embedding的方式除了可以带来数据量的压缩外,还可以引入特征向量之间的关系表达。以对城市和国家的表达为例,看到北京自然会想到是中国的首都,二者的关系可以体现在向量空间距离很近,如图2所示。

图片

图2 国家和首都在嵌入表中表达的空间距离示意图[3]

正是得益于embedding表达中潜在的关系,使得使用机器学习的方式来探究数据内部的关系成为可能。在具体应用中,通过embedding table的查找(本质是全连接的操作),使得原本高维稀疏的矩阵变为低维稠密矩阵,然后进入到深度学习的计算中,典型的应用就是广告推荐。

广告推荐中的embedding

虽然嵌入层将高维稀疏矩阵转换为低维稠密矩阵,降低了参数的数量,然而广告推荐场景面对的是千亿级别的商品,十亿级别的用户,因此嵌入表的规模越来越大,达到TB不足为奇。因此,在广告推荐模型中对嵌入层的优化成为影响模型质量的重要因素。规模巨大的嵌入表导致广告推荐模型的计算变为访存密集型任务,如何充分利用GPU上的内存容量减少数据搬移,同时又发挥GPU的通信高带宽的性能优势成为研究的目标。

图片

图3 one-hot编码和embedding的对比

在广告推荐模型中,采用和word2vec类似的嵌入表示方法,而用户和商品很多,如果使用one-hot编码会导致嵌入表急剧膨胀,以图3中亿级别的用户为例,使用embedding编码后,数据量可以从10的9次方压缩到10的3次方。图4表示的是用户和商品ID及对应的嵌入表查询过程,图中的特征向量的维度为4,但在实际应用中,不同特征的特征向量不一定相同。

图片

图4 特征向量维度为4的嵌入表[3]

在广告推荐场景中,经常使用feature (categorical feature),categorical data,feature field(slot)术语,本文将其翻译为特征,特征数据及特征域。

以电影推荐场景为例,电影名称,用户性别,用户年龄,手机等等均可以看作是一类特征。特征数据是具体的特征描述,比如手机分为苹果,华为和小米等。特征域指的是将相关的特征聚合在一起,作为一个域,也就是说在一个feature field会包含几类特征。比如在经典的YouTube视频推荐模型中,关于language的分析,可以看成是一个feature field,里面聚合了user language和video language。对于一个feature filed中的特征向量,会进行combiner的操作,可以是求平均或者是求和等。

图片

图5 YouTube视频推荐模型[4]

稀疏Embedding的分配方式

关于embedding的分配,一般是根据embedding 的key均匀地分配到CPU或者GPU中,比如根据embedding的key对GPU的模值,将embedding分配到各个GPU。但在HugeCTR中,关于embedding的分配以slot(slot等同于前文的feature field)为单位(slot是一等公民),每个slot的特征可以单独embedding,然后再合并为一个嵌入向量,这样的收益是确保同一个特征域的特征向量在一台GPU上,可以较为高效地进行combiner的操作,如后文的图8的本地化模式所示。

HugeCTR是Nvidia推出的针对点击率(Click-Through Rate)场景的分布式推荐框架,支持多GPU及多GPU节点的训练模式,底层则采用GPU的优化库实现,比如NCCL,CuDF[5]等。HugeCTR也可以作为TensorFlow的插件使用,大致的自顶向下的层次如图6所示。

图片

图6 HugeCTR的层次图

稀疏embedding的分配分为分布式(distributed)模式和本地化(localized)模式。在分布式模式下,如图7所示,一个slot可以位于多个GPU上,比如slot0中的特征可以位于GPU0和GPU1上,slot1的特征也可以位于GPU0和GPU1上。分布式的方式适合slot的大小超过了GPU的内存。分配到GPU的计算规则为: feature_key % GPU_NUM,和上文提到的按照embedding的key进行均匀分配相同。

图片

图7 分布式模式的稀疏embedding的分布

本地模式指的是将slot中的特征完整地放在一个GPU内存中,不会跨GPU存放,比如slot-0放在GPU0,slot-1放在GPU1, slot-2放在GPU0等,如图8所示。使用本地化模式的前提是GPU内存能够完整存放下一个slot的大小,相比于distributed模式,优先推荐使用local模式,具有更好的性能,同一个slot内的特征处理可以在一个GPU上完成。分配到GPU的计算规则为: slot_id % GPU_NUM。

在这里插入图片描述

图8 本地化模式的稀疏embedding的分布

图9展示了slot中特征向量的combiner的过程。一个sample中有7个key,分布在两个slot中,第一个slot有4个key,第二个slot有3个key,第三个slot没有key。在查找的过程中,第一个slot中的4个key分别找到对应的特征向量进行sum操作得到新的特征向量v1,第二个slot找到3个key对应的特征向量进行sum得到新的特征向量v2。组后把v1和v2 concat。注意在hugeCTR中不允许不同的slot中出现相同的key,在hugeCTR中支持的combiner操作为求和和取平均。

在这里插入图片描述

图9 slot中特征向量的combiner操作

Embedding表的查询

在HugeCTR的实现中,为了提高embedding table的查询及插入性能,采用了二级hash的方式进行构建,如图10所示。

\1. 第一级hash提供的是逻辑hash,背后的实现根据hash计算得到,而不是真的查找表,目的在于节省存储空间。Key相当于稀疏输入(比如one-hot格式输入),经过hash计算后得到value,value表示的是第二级hash table中key的行偏移。

\2. 第二级是真正存储在GPU内存中hash table,key为嵌入向量的行偏移,value为最终的嵌入向量。图中hash_value_index_tensors_存储的是GPU数量个hash_value_index,hash_value_index中的每个元素表示在当前GPU中嵌入向量的行偏移。整个hash_value_index_tensors_的大小是每个slot的特征数累加和与batch_size大小的乘积,如公式1所示(nnz_per_slot表示每个slot中的特征数量),记录了所有的低维稠密矩阵offset,如此以来,hash table的大小就被固定了(这种设计也限制了支持更大的参数场景)。同理hash_table_value_tensors_表示每个GPU中存放的嵌入向量的值,hash_table_value_tensors_的大小是每个GPU上存放的最大特征数量和特征向量大小的乘积,如公式2所示(max_vocabulary_size_per_gpu表示每个GPU的最大特征数量)。

图片

图10的上图表示为高维稀疏矩阵经过embedding优化后得到的低维稠密矩阵,储存在GPU内存中。以苹果的稀疏输入为89举例,苹果特征的slot分布在GPU0上,通过一级hash计算得到row_index为2,从GPU0上的hash table中找到row_index=2对应的行偏移为0,如图10的下图所示,然后从hash_table_value[0]的row_offset=0的位置获得苹果的嵌入表向量9898。

图片

图10 hash表查询过程示意图

第二级hash的实现是完全放在GPU内存中,包装在cuDF(GPU DataFrame)的库中,依赖于concurrent_unordered_map类,是一个GPU加速的哈希实现,支持并发的insert,但不支持并发的insert和get,这是和hugeCTR仅支持同步训练有关系,不会同时进行pull和push操作。

图10是简化的示意图,在实际代码实现中引入了bucket的概念,如图11所示,在经过对hash_table_size取模后,得到一个hash bucket,bucket中存有key和value,其中value对应图10中的hash_value_index,根据hash_value_index所对应的行偏移,在hash_table_value(embedding table)中找到嵌入特征。

图片

图11 带有bucket的hash查找过程

构建embedding table

为了压缩稀疏矩阵的存储格式,hugeCTR中采用了CSR(Compressed Sparse Row)的稀疏压缩方法,如图12中的左图所示,针对一个稀疏矩阵,仅存储矩阵的非0数值,以及数值对应的行偏移和列偏移。

图片

图12 CSR的数据表示和在slot中的表示

图12的右图中,一共有3个slot,每个slot中有不同数量的特征数,比如slot-0中有3个特征,0,1,2表示对应的embedding key。现有3个样本,分别以row-0,row-1和row-2表示。以row-0为例,它的column index是[1, 3, 4, 8],即slot中的key,将row的数据以slot为行进行排布,然后根据CSR的表示方法,可以得到对应的row_index为[0, 1, 3, 4],可以看成是稀疏输入。

图13表示的是一个构建好的embedding table,同样以row-0为例,row-index是前文提到的hash_table_value_index,sparse tensor表示的是稀疏输入,对应前文提到的hash table key。以图12的row-0的row_index[0, 1, 3, 4]作为稀疏输入,分别在不同的slot中找到row-offset(此处的row-offset指的是嵌入特征在内存中的行偏移),然后根据行偏移从GPU内存中找到对应的嵌入特征向量。

图片

图13 embedding table示意图

总结与思考

本文介绍了hugeCTR中关于embedding table在GPU中实现方式,分析了如何利用二级hash的方式实现嵌入特征的查询以及采用稀疏压缩的方式构建嵌入表。由于篇幅有限,文中略去了实际的代码实现,对部分细节进行了抽象。当然,对于embedding table的操作,采用hash的实现仅仅是一种处理方式,也是技术栈中的一个小环节,在具体的实现中,可以自行设计策略,关键的问题是如何保证embedding table的操作,这里面包括从存储服务器到主机内存(CPU内存)再到GPU内存之间的数据拷贝,查找,更新等操作,里面涉及到很多工程实现问题。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(Java):集合类LinkedList集合类Stack

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构(故不支持随机访问): 在LinkedList中,定义了first和last,分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…

TikTok短视频矩阵管理系统源码

在数字化浪潮汹涌的今天,短视频已成为人们生活中不可或缺的一部分。TikTok作为短视频领域的佼佼者,其用户基数庞大,影响力深远。然而,对于众多内容创作者和营销人员来说,如何高效管理多个TikTok账号,实现批…

分布式训练

一、分布式计算 跟多GPU不同是:数据不是从主存拿的,是在分布式文件系统拿的,有多个工作站,工作站中有多个GPU,通过网络读取数据到GPU中,GPU通过网络接收到来自参数服务器的参数进行运算计算梯度&#xff0c…

Biotinylated L-Thyroxine (T4) ;生物素 L-甲状腺素(T4)

一、基本信息 常用名:Biotinylated L-Thyroxine (T4) 生物素 L-甲状腺素(T4) 英文名称:Biotinylated L-Thyroxine (T4) 中文名称:生物素 L-甲状腺素(T4) 二、组成与性质 生物素:一种水溶性维生素,也称为维生素B7&#…

Photoshop批量处理图片分辨率

整理一些文件的时候,发现需要处理大量图片的尺寸和分辨率。如果一张一张的处理就会很慢,搜了下,Photoshop提供自动批量处理的方法。在此记录一下。 一、说说批量处理图片 1.打开PS软件并导入图片,我用的是比较老的版本cs4&#…

在创建jsp项目中解决无法连接数据库以及junit问题

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

将 Vision Transformer 用于医学图像的语义分割

关于ViT的关键点如下: ViT架构基于将图像表示为一组补丁。图像补丁是图像的非重叠块。每个块最初都有一个由该块中的图像像素形成的嵌入向量。Transformer编码器是ViT的主要部分,它根据它们的类别归属来训练补丁之间的相似度。它包含一系列线性、归一化…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口, 那么你项目一定充斥着大量的对接逻辑和代码, 并且针对不同的对接渠道方需要每次封装一次调用的简化, 一旦封装不好系统将会变得难以维护&am…

SprintBoot创建遇到的问题

最近使用IDEA版本为2022.3.1&#xff0c;java版本为21.0.3&#xff0c;现在做一个创建SprintBoot3的一个大体流程 1.先下载Maven&#xff0c;解压到一个位置 maven下载 2.配置setting.xml文件 这路径自己配置&#xff0c;这里不多演示 代码如下&#xff1a; <mirror>&…

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…

开关电源——15种控制模式(1)

关于开关电源的控制模式&#xff0c;TI官网的控制模式快速参考指南有相对全面的归纳和描述&#xff0c;提供了15种不同的控制架构&#xff0c;这些架构涵盖了从基础到高级的多种控制模式&#xff0c;以适应不同的应用需求&#xff0c;如下表所示&#xff1a; 以下是对控制模式相…

记一次Ueditor上传Bypss

前言 前一段时间和小伙伴在某内网进行渗透测试&#xff0c;目标不给加白&#xff0c;只能进行硬刚了&#xff0c;队友fscan一把梭发现某资产疑似存在Ueditor组件&#xff0c;但初步测试是存在waf和杀软的&#xff0c;无法进行getshell&#xff0c;经过一番折腾最终getshell&am…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

f_mkfs格式化最小分区数是191

使用fatfs的f_mkfs最小分区数是191原因&#xff1a; 在挂载ram_disk时参考的文章有提到&#xff1a; “然后是GET_SECTOR_COUNT 用于f_mkfs格式化时获取可用的sector的数量&#xff0c;32bit-LBA的情况下至少为191” 自己也实际试过确实要不少于191&#xff0c;网上也没找到相…

【单片机毕业设计选题24056】-基于STM32的八路抢答器设计

系统功能: 系统上电后显示“欢迎使用八路抢答系统请稍后”&#xff0c;两秒后进入正常页面显示。 第一行显示系统状态信息&#xff0c;第二行显示抢答计时时间&#xff0c;第三行显示设定的抢答时间&#xff0c; 第四行显示系统状态&#xff08;空闲状态或计时状态&#xff…

CST软件仿真内存设置-电磁仿真cst软件教程

当大家使用CST软件进行仿真时&#xff0c;可能会有仿真内存的设置需求&#xff0c;下面的内容是帮助大家如何设置仿真内存。 首先&#xff0c;打开CST软件并加载您的仿真模型&#xff0c;在软件界面中&#xff0c;找到菜单栏或工具栏中的“仿真设置”或类似的选项。 在仿真设置…

揭秘”大模型加速器”如何助力大模型应用

文章目录 一、大模型发展面临的问题二、“大模型加速器”助力突破困难2.1 现场效果展示2.1.1 大模型加速器——文档解析引擎2.2.2 图表数据提取 三、TextIn智能文档处理平台3.1 在线免费体验3.1.1 数学公式提取3.1.2 表格数据提取 四、acge文本向量化模型4.1 介绍4.2 技术创新4…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

Django项目的基本准备工作【1】

【 一 】pip换源 # 1 之前装第三方模块 pip3 install django -i 镜像仓库 ​ # 2 一劳永逸--》整点配置&#xff0c;以后安装模块&#xff0c;自动去配置好的源下载 ###windows 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用…