香侬科技Service Streamer:加速深度学习Web服务、极大提高GPU利用率。| 百万人学AI评选

香侬科技Service Streamer:加速深度学习Web服务、极大提高GPU利用率。| 百万人学AI评选

2020 无疑是特殊的一年,而 AI 在开年的这场”战疫“中表现出了惊人的力量。站在“新十年”的起点上,CSDN【百万人学AI】评选活动正式启动。本届评选活动在前两届的基础上再度升级,设立了「AI优秀案例奖Top 30」、「AI新锐公司奖Top 10」、「AI开源贡献奖Top 5」三大奖项。我们相信,榜样的力量将成为促进AI行业不断发展的重要基石,而CSDN将与这些榜样一起,助力AI时代的”新基建“。

活动官网:https://bss.csdn.net/m/topic/ai_selection/index

申报地址:http://csdnprogrammer.mikecrm.com/WpA03hJ

一、公司简介

北京香侬慧语科技有限责任公司(以下简称“香侬科技”),专注于人工智能、深度学习、机器学习等技术的研发,从成立之日起,就希望发展成为具有中国文化特色、立足于中国本土的全球技术领先人工智能公司,所以香侬科技是全球第一家专门针对中文提出基于中文的自然语言处理模型的公司。此外,香侬科技一直以来都非常重视基础科学和技术创新性的研究,累积在自然语言处理*会议发表文章50余篇。

除了重视基础研究外,香侬科技也同样重视技术的落地,目前主要将人工智能技术应用于金融领域,提供全球资本市场信息智能服务以及智能投研舆情项目服务,致力于为金融行业从业者提高信息获取能力、基础数据支持及智能技术服务,以便让相关从业者可以及时掌握、了解行业、企业动态,为金融资产管理、风控评级、行业研究、投资决策等各类金融业务赋能。目前已与60余家机构展开了合作,包括战略支援部队、军事科学院、上交所、证监会、中信建投证券、招商银行等机构。

公司于2017年12月成立,2018年1月获红杉中国数千万人民币融资,于2018年9月完成红杉中国领投的过亿元人民币A轮融资,累计融资额近2亿元人民币。

 

二、开源项目简介

时间

2019年7月22日

背景

深度学习模型在训练和测试时,通常使用小批量(mini-batch)的方式将样本组装在一起,这样能充分利用GPU的并行计算特性,加快运算速度。 但在将使用了深度学习模型的服务部署上线的时候,由于用户请求通常是离散和单次的,若采取传统的循环服务器或多线程服务器, 会造成GPU计算资源浪费,用户等待时间线性增加。更严重的是在大量并发请求时,会造成CUDA out-of-memory error,导致服务宕机。

基于以上现实问题,我们开源了ServiceStreamer,用于加速深度学习Web服务。ServiceStreamer是一个中间件,将服务请求排队组成一个完整的batch,再送进GPU运算。牺牲最小的时延(默认最大0.1s),提升整体性能,极大提高GPU利用率。

技术创新性

Service Streamer有以下特点:

  1. 简单易用: 只需添加两三行代码即可让模型提速上十倍。
  2. 处理速度快: 低延迟,专门针对速度做了优化。
  3. 可扩展性好: 可轻松扩展到多GPU场景,处理大量请求。
  4. 适用性强: 中间件,适用于所有深度学习框架和web框架。

主要应用领域:深度学习

开源地址:https://github.com/ShannonAI/service-streamer/blob/master/README_zh.md

 

三、开源影响力介绍

ServiceStreamer可以极大提高深度学习模型在Web服务器上的运行速度。通过service_streamer封装用户的模型函数,仅需要三行代码,就可以使得BERT(一个大规模深度学习模型)服务的预测速度达到每秒200+句,在原来的基础上提高了15倍的QPS。同时,利用Streamer封装模型,启动多个GPU Worker,充分利用多卡性能,能够实现每秒1000+句,是原来的80倍QPS,极大地加速了深度学习模型在Web端上的运行。

最小实现

在技术上,用service_streamer中间件封装predict函数,将request排队成一个完整的batch,再送进GPU。 牺牲一定的时延(默认最大0.1s),提升整体性能,极大提高GPU利用率。然后web server需要开启多线程(或协程)即可。

分布式GPU Worker

实际项目中web server的性能(QPS)远高于GPU模型的性能,所以我们支持一个web server搭配多个GPU worker进程。Streamer默认采用spawn子进程运行gpu worker,利用进程间队列进行通信和排队,将大量的请求分配到多个worker中处理。 再将模型batch predict的结果传回到对应的web server,并且返回到对应的http response。上述方法简单,但是主进程初始化模型,多占了一份显存,并且模型只能运行在同一块GPU上。 所以我们提供了ManagedModel类,方便模型lazy初始化和迁移,以支持多GPU卡。

分布式Web Server

有时候, web server中需要进行一些cpu密集型计算,比如图像、文本预处理,再分配到gpu worker进入模型。 cpu资源往往会成为性能瓶颈,于是我们也提供了多web server搭配(单个或多个)gpu worker的模式。

使用RedisStreamer指定所有web server和gpu worker公用的唯一的redis地址。然后跟任意python web server的部署一样,用gunicorn或uwsgi实现反向代理和负载均衡。这样每个请求会负载均衡到每个web server中进行cpu预处理,然后均匀的分布到gpu worker中进行模型predict。

本项目目前已经在github上有564个Star,88个Fork,数十个Pull Request,推动了深度学习模型Web加速社区的交流与发展。