Netflix开源面向稀疏数据优化的轻量级神经网络库Vectorflow

介绍

随着过去几年来深度学习库和软件创新的蓬勃发展,研究机器学习是一个激动人心的时刻。大多数机器学习的库都是从相当专业的计算代码演变而来的,这些计算代码一般用于解决大密集度问题,例如为稀疏模型提供边缘支持的基于神经网络的图像分类通用框架。

在Netflix公司,我们的机器学习科学家在多个不同的领域处理着各种各样的问题:从根据你的爱好来定制电视和推荐电影,到优化编码算法。我们有一小部分问题涉及到处理极其稀疏的数据;手头问题的总维度数很容易就能达到数千万个特征,即使每次要看的可能只是少数的非零项。对于这些情况,我们认为需要有一个经过专门优化的轻量级的库,这个库用于在单一设备、多核环境下对稀疏数据进行浅层前馈神经网络的训练。我们想要一些小巧而又易用的工具,所以我们构建了Vectorflow,它是目前机器学习科学家使用的众多工具之一。

设计注意事项

  • 敏捷性。我们希望数据科学家能够在完全自主的情况下轻松地运行和迭代他们的模型。所以我们用D语言写了Vectorflow。D语言是一种并不难学的现代系统语言,它具备快速的编译器和函数编程功能,为初学者提供了类似Python的使用体验,但在运行时通常具有多个数量级的性能提升,同时让经验丰富的开发人员能够利用其优秀的模板引擎、编译时功能和低级别特性(C接口、内联汇编器、手动内存管理、自动向量化等等)。Vectorflow没有任何第三方的依赖,从而简化了其部署。它提供了一个基于回调的API,可轻松接入自定义的损失函数来进行训练。
  • 稀疏感知。在设计稀疏数据库与浅层架构库的过程中,运行时瓶颈往往是在IO方面:例如,与大密集度矩阵上的卷积层不同,其运行每一行的操作极少。Vectorflow能够尽可能地避免在正向与反向传递过程中的内存复制或分配操作。矩阵向量操作同时拥有稀疏与密集两种实现方式,其中密集型是SIMD向量化的。Vectorflow还提供了一种在处理稀疏输出梯度时进行稀疏反向传递的方式。
  • IO未知。如果是IO绑定,那么根据定义,训练器的运行速度由IO层的速度决定。Vectorflow对底层数据模式的要求非常宽松(仅需提供一个具有“features”属性的行迭代器),以便可以根据数据源编写高效的数据适配器,以及在使用同一编程语言的时候避免任何预处理或数据转换步骤。这样,你就能根据数据来移动代码,而不是根据代码移动数据。
  • 单一设备。分布式系统难以调试,而且还会引入固定成本,例如作业调度。基于新型机器学习技术的分布式优化则更加困难。因此,我们基于单机设置建立了一个高效的解决方案,以此来降低了建模的迭代时间,并且不会牺牲中小规模任务(1亿行)的可扩展性。我们选择使用Hogwild的通用异步SGD解算器作为免锁定方案,以使得在没有通信成本的情况下将负载分散到各个不同的内核上。只要数据足够稀疏,这就适用于大多数的线性或浅层网络模型。由于从用户的角度来看,所有的一切都运行在非分布式的环境下,这样就避免了在算法分布方面花过多的精力。

应用程序

在项目启动后的几个月里,我们看到了很多基于该库的用例,同时也有多个研究项目及生产系统开始利用Vectorflow进行因果推论、生存回归、密度估算和推荐排名算法。事实上,我们正在使用 Vectorflow对Netflix主页的部分用户体验进行测试。Vectorflow也被包含在Netflix机器学习从业者所使用的基础实例内的默认工具箱中。

例如,我们基于Netflix在营销工作当中遇到的一项宣传问题对该库的性能进行了调查。在这个案例中,我们要用生存指数分布执行加权最大似然估计。要实现这个目标,需要向Vectorflow传递出以下自定义的回调函数:

利用此回调进行训练,我们可以轻松比较这三种模型:

  • 模型 1:基于小型稀疏特征的线性模型(需要学习约 500 个参数)
  • 模型 2:基于大型稀疏特征的线性模型(需要学习 100 万个参数)
  • 模型 3:基于稀疏特征的浅层神经网络(需要学习 1000 万个参数),训练数据量翻倍

这里的数据源是存储在S3上的一个Hive表,其中的列式数据格式是Parquet。另外,我们通过将该数据流传入c4.4xlarge实例并构建内存内训练集的方式进行直接训练。结果如下所示:

解压缩和特征编码都是在单线程上实现的,因此这还有改进的空间,但根据其端到端的运行时来看,并不需要使用针对中等规模稀疏数据集和浅层架构的分布式解决方案。请注意,训练时间与数据的稀疏度以及行数存在线性关系。阻止线性可扩展性的一个原因是,当多个异步SGD线程的权重相同时,CPU存储器内在结构创建的缓存将会无效,因此如果模型参数访问模式不够稀疏的话,会破坏Hogwild的理论结果(详细内容请参见这篇文章)。

未来的工作

接下来,除了简单线性、多项式或者前馈架构之外,我们计划进一步开发更加专业的层以扩大拓扑支持能力,并在维持Vectorflow项目“极简”设计理念的前提下探索新的并行策略。

文章原标题《Introducing Vectorflow》,作者:Benoît Rostykus, Netflix Technology,译者:夏天,审校:主题曲哥哥。

文章为简译,更为详细的内容,请查看原文

时间: 2024-12-08 17:59:41

Netflix开源面向稀疏数据优化的轻量级神经网络库Vectorflow的相关文章

面向费用优化的云存储缓存策略

面向费用优化的云存储缓存策略 唐兵 张黎 为提高云存储的访问速率并降低费用,提出了一种面向费用优化的云存储缓存策略.利用几乎免费的局域网环境下的多台桌面计算机,在本地建立一个分布式文件系统,并将其作为远端云存储的缓存.进行文件读取时,首先查找其是否在缓存中,若存在则直接从缓存读取;若不存在则从远端云存储读取.采用了最近最少使用(LRU)算法进行缓存替换,将冷门数据从缓存中替换掉.以亚马逊简单存储服务(S3)作为远端的云存储服务,对原型系统进行了简单的性能测试.测试结果表明,使用了所提出的缓存策略

Netflix 开源改革计划:新 Netflix 开源门户

Netflix 经过几年的开源实践,推出最新开源改革计划,打造了全新的 Netflix 开源门户,并且会继续开源更多好项目,增加 Netflix 项目开源透明度. 开源中国现已收录了 68 款 Netflix 开源项目:http://www.oschina.net/project/netflix 互联网流媒体播放商 Netflix 在几年前就开始创建自己的开源门户 Netflix Open Source (别名 NetflixOSS) 了,他们并不知道这会如何发展:也不知道开源贡献者是否会使用,

戴尔存储:实现面向应用优化的存储架构

基于戴尔流动数据(Fluid Data)架构及戴尔丰富的"全面存储"产品线与解决方案,戴尔存储在适当的时间将以合理的成本,将正确的数据,放在合适的存储系统和存储介质上,从而达成最优化的数据存储与管理,实现面向数据与应用优化的存储架构. 戴尔流动数据技术(Fluid Data)是一项突破性技术,可在合适的时间以合适的成本,通过智能化和自动化的方式,将数据自动置于合适的存储中,从而高效地管理和保护不断增长的数据. 戴尔流动数据结构通过自动分层迁移数据,让数据的存储充分符合信息生命周期的规律

40 个轻量级 JavaScript 库 (下)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 流行的 JavaScript 库不胜枚举,jQuery, MooTools, Prototype, Dojo, YUI.这些 JavaScript 库功能丰富,加上它们的插件,几乎能胜任任何工作,然而这是有代价的,这些库往往导致你的网页尺寸臃肿.在某些场合,如果你只想完成特定的工作,可以使用 一些功能更专一的轻量库,本文介绍了40个非常出色的

40 个轻量级 JavaScript 库 (上)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 流行的 JavaScript 库不胜枚举,jQuery, MooTools, Prototype, Dojo, YUI.这些 JavaScript 库功能丰富,加上它们的插件,几乎能胜任任何工作,然而这是有代价的,这些库往往导致你的网页尺寸臃肿.在某些场合,如果你只想完成特定的工作,可以使用 一些功能更专一的轻量库,本文介绍了40个非常出色的轻量级 JavaScript 库. 1. 表单相关 wForms 一个低调的开源项目,简化了绝大多数常用 J

神经网络库FANN的使用

问题描述 神经网络库FANN的使用 我用的是最新版本的FANN,经过vs2013build之后生成了一些.lib文件和.exp文件,这些文件应该如何使用?我尝试过将lib文件直接放入资源文档中,之后使用#pragma comment(libxx.lib"")但是编译FANN提供的example的时候还是会报错Error 13 error LNK1120: 5 unresolved externals...example中调用的函数无法解析,不知道应该如何解决,求教!!! 解决方案 参考

牛客网:一个只面向程序员的“猿题库”

如果以媒体惯用的角度报道,这个故事应该是这样的:在阿里巴巴 上市前夜离职,舍弃百万股权毅然辞职创业.但这个方式还是感觉略LOW.正常的故事应该是这样的:都是前人人同事,一个月以前团队成员还分散在各地兼职做产品.一个月之后大家分别从现东家辞职来到北京回龙观居于民宅创业.微博头像头戴带小花的人叫叶向宇,此前一直在阿里巴巴做技术专家.他们目前的创业项目是牛客网,一款面向程序员的在线面试 笔试题库产品.形象点来说:你可以理解它为面向程序员的猿题库".他们把大型公司的程序员笔试面试的题目进行收集,前期主要

libonion 0.4.0发布 一个轻量级的库

libonion一个轻量级的库,可帮助您添加HTTP(和http://www.aliyun.com/zixun/aggregation/29830.html">HTTPS)的功能到您的程序.可以建立最少的内存和CPU占用,这使得它适用于嵌入式系统的理想小型服务器,并添加HTTP的功能到现有的方案. libonion 0.4.0该版本许可证更改为LGPL.一些小的修正以使之成为一个稳定的版本. 下载地址:https://github.com/davidmoreno/onion

Java并发——Synchronized优化(轻量级锁、偏向锁)

1 重量级锁 在上一篇博客中我们知道,Synchronized的实现依赖于与某个对象向关联的monitor(监视器)实现,而monitor是基于底层操作系统的Mutex Lock实现的,而基于Mutex Lock实现的同步必须经历从用户态到核心态的转换,这个开销特别大,成本非常高.所以频繁的通过Synchronized实现同步会严重影响到程序效率,而这种依赖于Mutex Lock实现的锁机制也被称为"重量级锁",为了减少重量级锁带来的性能开销,JDK对Synchronized进行了种种