ios yymodel 将字典转数组模型_TensorNet——基于TensorFlow的大规模稀疏特征模型分布式训练框架

TensorNet是什么?

TensorNet是一个构建在TensorFlow之上针对广告推荐等大规模稀疏场景优化的分布式训练框架。TensorNet的目标是让所有使用TensorFlow的开发者可以快速的、方便的训练出稀疏参数超过百亿的超大模型。

训练带有大规模稀疏特征模型的主要挑战

在广告、搜索、推荐等场景下的深度模型都会存在大量的高维离散稀疏特征,训练带有高维稀疏特征的模型主要有两个问题:

  1. 训练样本规模大。比如对于360广告场景会有超过100TB的训练数据。
  2. 模型参数多。比如对于360广告场景会有超过100亿的参数。

使用单机模式训练模型速度慢,耗时长,严重制约了模型的迭代速度,使用分布式训练已经成为业界标准。

使用TensorFlow训练稀疏特征模型的主要问题

TensorFlow是最受开发者欢迎的深度学习训练框架,但是TensorFlow对训练带有大规模稀疏特征的模型不太友好,主要问题有:

  1. TensorFlow支持的特征维度有限。一般的,TensorFlow需要对每一个特征定义一个矩阵,这个矩阵受限于内存,往往不能太大。
  2. TensorFlow2.x对参数服务器的支持较少,使用同步训练的模式会比较慢。

TensorNet——基于TensorFlow的专为大规模稀疏特征模型优化的分布式训练框架

TensorNet在复用TensorFlow的所有功能的基础之上,专门定制使其支持大规模稀疏特征模型的训练。TensorNet的主要提升包括:

  1. 使TensorFlow支持的稀疏特征的维度接近于无限
  2. 使TensorFlow2.2 keras支持基于参数服务器的异步训练模式,极大的提升了训练速度。在360真实业务场景下我们将原来的离线训练时间由3.5小时提升到了25分钟
  3. 配合TensorNet通过split graph的方法可以对在线推理的性能进行优化。在360真实场景测试中我们发现有近 35% 的性能提升。

TensorNet分布式训练架构

TensorNet支持异步和同步模式训练。异步模式在仅有CPU的集群中速度提升十分显著,同步模式在网卡速度超过100GbE的GPU集群中表现突出。

TensorNet异步训练架构

在仅有CPU的集群中使用参数服务器的异步训练模式是训练模型速度最快的方法,TensorNet异步训练架构与TensorFlow的异步训练架构有很大的区别:

  1. TensorNet将sparse参数和与dense参数分别使用不同的parameter server管理。
  2. TensorNet不设单独的parameter server节点。在每个worker中都会维护一个sparse paramter server和dense parameter server。这省去了开发人员管理ps节点和worker节点的不少麻烦。
  3. TensorNet对sparse参数使用分布式哈希表按照哈希值均匀分布不同的节点上。这相较于TensorFlow需要让开发者根据自身情况将tensor分布在不同的ps节点上的方法更加灵活,这不仅减小了节点通信热点的概率,还减轻了开发者的工作量。
  4. TensorNet将模型的所有dense参数合并后使用分布式数组切分到不同的机器上,每次pull和push参数的时候只有一次网络请求。相较于TensorFlow对每个tensor都有一次网络请求的方法极大的减少了网络请求的次数从而提升了模型训练的速度。

v2-3dde8b6813c58daba73bf5d4bbca6cc1_b.jpg
TensorNet异步训练架构

TensorNet同步训练架构

TensorNet同步训练架构基本与TensorFlow的MultiWorkerMirroredStrategy架构一致,主要区别如下:

  1. TensorNet使用单独的sparse parameter server节点保存所有sparse参数。通过parameter server可以解决TensorFlow支持的sparse特征维度不能太大的问题。
  2. TensorNet对sparse参数做了特殊的定制化的同步。TensorNet在训练时由于每个batch内的sparse参数的`IndexedSlices`指向的内容与TensorFlow默认的不同,我们对此做了定制化的同步。

v2-8a3fc77860b1ac3f26b2427bdbc6657a_b.jpg
TensorNet同步训练架构

TensorNet核心优化

TensorNet最核心的优化是将模型的embedding tensor优化到了最小。如下图所示,对于最简单的wide&deep模型,如果在一个广告系统中有3亿用户,那么就需要定义一个维度为3亿的embedding矩阵,在训练模型时需要在这个3亿维的矩阵上做embedding_lookup得到当前batch内的用户的embedding信息,近而在embedding之上做更加复杂的操作。

v2-fac431bcd2089b781e84b3917a862526_b.jpg
TensorFlow中的实现

TensorFlow中的实现在高维稀疏场景下,embedding矩阵太大,占用内存多。很显然当特征较多的时候单机无法存储整个模型。

TensorNet使用一个较小的,可以容纳特征在一个batch内所有数据的embedding矩阵代替TensorFlow默认实现中需要定义的较大的embedding矩阵

如下图所示,在batch_size设置为1024的场景下,对于用户id特征,在TensorNet中只需要定义一个维度为1024的embedding矩阵,TensorNet的主要处理步骤如下:

  1. 定义模型时定义userid的embedding矩阵的维度为一个batch内所有用户id个数的最大值。
  2. 训练模型时得到当前batch内的所有用户id。
  3. 将用户id排序,并按照先后顺序为每个userid分配索引,索引从0开始,对应为下图中的virtual sparse feature
  4. 使用userid从parameter server中获取相应的embedding向量,然后按照其对应的索引放置到embedding矩阵中。
  5. 使用转换后的virtual sparse feature作为模型的输入。

v2-3310b6d506a2ca1f73e746c26a57d1a1_b.jpg
TensorNet中的实现

从上述可见,TensorNet由于极大的减小了模型所需要的embedding矩阵,从而可以极大的减小内存的开销,以及通过parameter server的方式使得稀疏特征的维度可以支持到接近无限维,从而可以极大的提升模型的刻画能力。

TensorNet Inference优化

由于TensorNet只更改了模型的第一层,从而模型的inference也变得极其简单。

在使用TensorNet构造模型的时候,可以将模型切分为两部分,如下图所示,embedding_lookup_graph只在离线训练时使用,在线inference时只需要将sparse embedding导出成字典供inference_graph作为输入即可,具体的请参考以下系列文章:

1. 为inference准备——模型切分: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/03-split-to-sub-graph.ipynb

2. 使用XLA方式进行在线预估: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/04-deploy-tf-graph-online.ipynb

3. sparse embedding字典导出: https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/05-export-sparse-feature-embedding.ipynb

v2-196d6ee523e927f6804e282d735b6bf7_b.jpg
TensorNet中split graph inference方案

TensorNet中split graph inference方案

在360内部场景中我们测试发现通过split graph配合XLA AOT的方法性能提升近35%

TensorNet开源及使用

TensorNet已经成功落地应用到了360广告ctr预估相关的场景中,并取得了显著的效果,我们已将代码、文档及我们在360广告的应用经验全部整理到了项目中,欢迎关注。

tensorNet主页:https://github.com/Qihoo360/TensorNet

tensornet快速上手:https://github.com/Qihoo360/tensornet/blob/master/doc/tutorial/01-begin-with-wide-deep.ipynb

更多文档请看:https://github.com/Qihoo360/TensorNet/README.md

联系方式:张彦升(zhangyansheng@360.cn),姚磊(yaolei@360.cn)

微信交流群:

https://weixin.qq.com/g/AQYAAB0H54Ncc-QyDTtKD2l-4V19WXGdpbUfFa6QqwS8NphK5kZ5tWAD0_c342jf (二维码自动识别)

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

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

相关文章

mysql 索引及索引创建原则

是什么 索引用于快速的查询某些特殊列的某些行。如果没有索引, MySQL 必须从第一行开始,然后通过搜索整个表来查询有关的行。表越大,查询的成本越大。如果表有了索引的话,那么 MySQL 可以很快的确定数据的位置,而不用查…

【链表】Add Two Numbers

题目: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) (5…

ecs服务器数据迁移_如何非常方便地从Windows文件服务器把数据完整地迁移到ONTAP Select...

这是一个续篇,如果你依然爱你的Windows文件服务器或者使用Windows文件服务没有任何问题的话,请忽略我。续自:从Windows文件服务器,到ONTAP Select软件定义存储感谢联想凌拓合作伙伴新锐英诚的帮助,我们成功地做到了从海…

oracle触发和存储过程,Oracle存储过程与触发器

Oracle存储过程与触发器存储过程存储过程最直接的理解:就是保存了批量的sql(select,insert,if for),以后可以通过一个名字把这些批量的sql执行,使用存储过程在大批量数据查询或计算时会带来高性能,存储过程编写和调试比较复杂&…

swift int转string_Swift集合类型协议浅析(下)

关注【搜狐技术产品】公众号,第一时间获取技术干货导读本篇是Swift集合类型协议浅析系列文章的下篇,在这篇文章中,我们将继续围绕集合类型协议展开讨论,侧重点更多地关注于String相关的周边协议。StringProtocol代表一个字符串&am…

oracle视图执行脚本,Sh脚本中查询Oracle v$视图时需要在$号前加转义符“\”

DBA经常会部署一些sh脚本登陆Oracle数据库查询v$动态视图得到一些东西来实际管理自动化的目的,但在sh脚本中写ORACLE SQL语句时,如果语句查询v$视图,直接写v$XXXX是不能成功的,shell会将$当成一个参数来处理。以下面一段简单的sh脚…

微信小程序页面跳转与返回并回传数据

2019独角兽企业重金招聘Python工程师标准>>> A页面&#xff1a; .wxml文件 <view class"flex-wrp"><text style"width: 32%;">选择城市</text><input style"width: 68%;" type"text" bindtap"ci…

地址栏 输入 参数 刷新参数丢失_小米11 Pro屏幕参数曝光:2K屏幕+120Hz刷新率

本周一&#xff0c;高通已经宣布将于12月初举行的骁龙技术峰会上正式发布新一代旗舰处理器——骁龙875。根据此前的曝光消息&#xff0c;小米11系列将首发搭载这颗芯片&#xff0c;网上也已经开始对这款新机进行曝光。日前&#xff0c;海外知名论坛XDA在MIUI 12的代码中发现了一…

Cypress EZ-USB FX3 DMA模式下的串口通讯

由于公司设备升级后出了问题&#xff0c;需要对USB驱动进行修改&#xff0c;原本使用的是寄存器模式进行UART传输&#xff0c;但是由于FX3寄存器模式会出现长时间延时等待的问题&#xff0c;不得不对其传输模式进行修改。虽然赛普拉斯的EZ-USB FX3系列芯片功能强大&#xff0c;…

springboot md5加密_实在!基于Springboot和WebScoket,写了一个在线聊天小程序

基于Springboot和WebScoket写的一个在线聊天小程序(好几天没有写东西了&#xff0c;也没有去练手了&#xff0c;就看了看这个。。。)项目说明此项目为一个聊天的小demo&#xff0c;采用springbootwebsocketvue开发。其中有一个接口为添加好友接口&#xff0c;添加好友会判断是否…

suse 启动oracle11g,SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接

SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接概述本课程主要讲解oracle数据库软件的安装及配置&#xff0c;以及数据库的创建过程和网络配置与连接等&#xff1b;同时讲解一些数据库安装过程中的常见问题解决办法。注意&#xff1a;本文当中引用的package_name均为…

Python pyenv

一、简介 一般在操作系统中我们会安装多个Python版本&#xff0c;所以在进行Python版本切换时会比较麻烦&#xff0c;pyenv就提供了一种简单的方式&#xff0c;能简易地在多个Python版本中进行切换的工具&#xff0c;它简单而优雅。pyenv有以下功能&#xff1a; 1&#xff09;进…

oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网

范围分区允许用户根据分区键列值的范围创建分区。下面是一个按范围分区表的示例&#xff1a;create table sales6(sales_id number,sales_dt date)partition by range (sales_dt)(partition p0701 values less than (to_date(2007-02-01,yyyy-mm-dd)),partition p0702 values l…

c++ try catch语句_再问你一遍,你真的了解try..catch(finally)吗???

定义首先来看下 MDN 的定义&#xff1a;The try...catch statement marks a block of statements to try and specifies a response should an exception be thrown.try...catch语句标记要执行的语句&#xff0c;并指定一个当有异常抛出时候的响应简短的一句的确描述了try...ca…

lamp架构,搭建一个网络平台

首先更改主机名和 hosts 安装软件包&#xff0c;设置启动服务 设置数据库密码 上传discuz论坛包 将discuz注册的用户名写在mariadb数据库中 解压discuz包 unzip discuz包 -d /var/www/html cd到upload下 cp -rf * /var/www/html 进入数据库 mysql -uroot -p create database…

MyEclipse中SVN的使用方法

1、 加载插件 svn-myeclipse插件site-1.10.2.zip&#xff0c;解压缩后&#xff0c;将文件夹下的所有文件拷贝到MyEclipse安装包下的MyEclipse 8.5\dropins文件夹下&#xff0c;然后重新打开myeclipse&#xff0c;会弹出一个报错窗口&#xff0c;不要管它&#xff0c;关闭后&…

oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...

使用数据泵导出数据库数据时&#xff0c;发现如下错误提示&#xff1a;ORA-31693: Table data object "CAMS_CORE"."BP_EXCEPTION_LOG" failed to load/unload and is being skipped due to error:ORA-02354: error in exporting/importing dataORA-01555:…

Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装

1.Go安装 1.1Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己习惯的方式进行&#xff0c;这里介绍三种安装方式&#xff1a; 1&#xff09;Go源码安装 2&#xff09;Go标准包安装 3&#xff09;第三方工具安装 这里主要介绍下Go标准包在CentOS6.5系统中的安装方式 …

python矩阵乘法_鱼书——第一章 Python入门

one 第一章1.1 Python是什么Python是一个简单、易读、易记的编程语言&#xff0c;而且是开源的&#xff0c;可以免费地自由使用。Python可以用类似英语的语法编写程序&#xff0c;编译起来也不费力&#xff0c;因此我们可以很轻松地使用Python。特别是对首次接触编程的人士来说…

keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

背景介绍OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则&#xff0c;将保证虚拟机只能发出&#xff0f;接收以本机Port为原地址或目的地址(IP、MAC)的流量&#xff0c;提高了云的安全性。但是LVS等需要绑定VIP的场景&#xff0c;默认流量是被拦截的。需要…