过去已去,未来已来

2019年已经过去很久了,2020年已经重拳出击了。2019年的变化让我都有点反应不过来,虽说我不想当一滩死水,但流动也过快了。2019年这一年我服的人比我前26年服的人加起来还多。由于在工作,学到很多东西都不能写出来,不过我都积累在公司的文档了。忍不住夸字节跳动的doc太好用了。为什么要写总结,一是实在没东西写,二是希望靠搜索引擎督促自己完成计划。


主要变化

  1. 由于各种原因,我不再从事翻译事业,做搜索去了。高中以来“让大家以后都不用学英语”的理想就这么轻易放弃了。
  2. 看了Fate樱线和天气之子,观念发生改变,我不要当正义的伙伴,世界就是你。可是我还是保持单身,还好还会被她人吸引。
  3. 我还在北京,回南方的冲动不那么强烈了。
  4. 看了8本书,比去年多了2本。。。争取今年16本。不过,画画事业荒废了,就买了新数位板,一副没画。

语言学习

计划完全跟实际对不上,我并没有学韩语或者印地语,倒是接触了西班牙语。拜谭老师悉心教导西班牙语,我学会了小舌音。这是我很久以来梦寐以求的技能,但我记不清什么时候开始有这个想法。小舌音是意外所获,西班牙语还是稍微学到点东西的, estudiar para saber 这样的简单句我还是能够看懂的。我发现学语言根据词频来学就好了,根据语料统计出词频,然后根据词典造句的方式学高频词,效率很高。由于我不再搞机器翻译,本来打算改变学习韩语的计划,后来发现,我得接触tiktok,还是得懂点基本的。所以韩语和日语是今年学习的重点了。


旅游拍照

2019年的情况有点特殊,我没能出远门玩玩。无论是西部计划还是日本计划都没能实施。钱和时间都不充分。不过我在5月份的时候进行了环太湖游,杭州、南京、苏州和上海,为什么是这几个城市,唉说多了都是泪。最有代表性的两张照片如下,第一张是去上海看TI 9,花了我好多钱,结果OG创造历史,什么魔咒都是假的,关键还是事在人为。第二张是故宫雪景,去年一年去了7趟故宫,还是学到很多的。今年还得去,今年的主要目标是结合故宫的实物了解中国古建筑,光拱枓就足够看一年了。今年一定要去日本。

我达到了抖音百赞的目标,虽然由于各种原因我买了dou+。。。2020年没这个计划了,我得继续挤时间画裸体美少女。


不讲道理的世界

研究生的时候把翻译书的钱捐了,学生回信了。被导师评价为我们在大学期间做的最有意义的事。导师把信传给他现在的学生看了,认为我们需要知道一下社会上的情况,能尽一点力是一点力。我选了一封付在下面,我也认真写了回信,也是我想说的话。这个世界是美好的。

京都漫画创作了那么多优秀的动漫,却被暴徒付诸一炬,给世界带来温暖,自己却被如此对待,这个世界太邪恶了。

紫罗兰永恒花园外传上映了,我只看到两个主题,一个是传递感情,一个是铭记名字,这样的京阿尼还是如此温柔的对待世界,这个世界我看不懂。

我还是更愿意相信世界是美好的,世界是概率的,期望上会往好的方向发展。尽管2020年1月还没过完,几大拳已经打来,打得人精神恍惚。

  1. 将帅无能,疫情失控,百姓囤货,口罩告急
  2. 伊朗美国暴走,核力量面临失控
  3. 澳大利亚大火失控,动物们流离失所

希望我的博客能双月更吧。。。

字节跳动搜索部门内推

这是一个内推任务。我发不了朋友圈,微博没有影响力。各位走过路过不要错过。你有兴趣或者身边的人有兴趣,麻烦发简历到 echo emhhb3NoZW5qaWFuLjAxQGJ5dGVkYW5jZS5jb20= | base64 -d 。


非官方介绍

搜索目前在头条是比较投入的方向,也是刚刚起步,希望与更多的人一起做更多的事。个人认为头条还是不错的,有很大的发展空间,待遇也好,是技术导向的公司。优势有

  1. 丰富的数据,并且有机会接触这些第一线数据
  2. 充足的计算资源,10000块卡,BERT什么都不在话下
  3. 年轻的团队,大家都非常平等,沟通没有障碍,就像在学校实验室一样,头就像实验室的导师

 


官方介绍

【部门介绍】
字节跳动公司搜索部门汇聚了大量行业顶尖产品和技术精英,旨在从0到1打造一个用户体验更加理想的通用搜索引擎,支持公司所有产品的搜索功能,包括今日头条、抖音、西瓜、火山、懂车帝等多款备受欢迎的知名app。在这里你有机会参与工业级搜索引擎从无到有的研发工作,并在此过程中挑战大规模分布式存储和计算架构、NLP、人工智能、ranking等世界难题,很好地锻炼自己的工程能力、算法能力、业务能力。加入我们,参与并见证一个新产品的成长和成功,同大牛们一起完成最有挑战性的工作吧!

【部门亮点】
– 公司重视程度高,团队力量强
– 从0到1,技术成长大
– 搜索系统更加复杂,挑战更大:
1. 规模:搜索数据规模更大(搜索是千亿级),对工程和算法的挑战更大,能搞定搜索的话去搞别的都不怕。
2. 场景:搜索对精度的要求比推荐更高,用户已经明确表达需求、出现不相关结果用户会吐槽,所以除了关注pv级指标、对每个搜索请求都要求精度,挑战更大。
3. NLP:搜索场景下NLP更重,人类自然语言理解问题是终极难题;deep learning已经能很好解决图像和语音等问题,但是在NLP上还有很长路要走,足见其难度;我们恰好又处在技术变革的时代,有搜索这样一个场景来研究NLP问题,是个最棒的土壤。

【招聘岗位】
算法工程师
后端开发工程师

TensorFlow XLA初步接触

Tensorflow越来越像一个编译器,把计算图编译为可执行代码。其中关键的部分就是XLA (Accelerated Linear Algebra)。我在实际使用中真切感受到了XLA带来的提升,希望对XLA能有更多的了解,因此花了点时间探索了一下。


XLA框架

关于XLA,Tensorflow给出了比较简略的说明。XLA主要是用来提升计算速度、节省内存(显存)等。XLA的输入语言称为“HLO (High Level Optimizer)”,HLO定义了整个计算图。随后,XLA对HLO进行一些机器无关、高层的优化,然后用LLVM等进行机器相关、底层的优化并生成代码。这个流程如下图所示。

  1. 描绘计算图HLO,这一步可以通过tf2xla、xla_client等完成
  2. 对HLO进行广义优化(机器无关),如CSELoop Fusion等编译常用优化策略
  3. 针对特定设备,对HLO进行优化
  4. LLVM等生成可执行代码

XLA流程,见https://www.tensorflow.org/xla/overview


Operation Semantics

我不是非常理解Operation Semantics是什么意思,有兴趣可以看看。我只知道HLO支持很多操作,其中比较容易接受的是Element-wise unary functions(包括abs、cos等)、Element-wise binary arithmetic operations(如相加、相乘等)……

跟这一部分比较相似的是TensorRT定义的操作,如IActivationLayerIElementWiseLayer等。其实神经网络很简单,靠这25个操作就能定义大部分网络。
有了这些定义之后,我们就可以描述一个网络即计算图。有了精确定义的计算图,就可以对其进行优化。


计算图优化

前面也提过,XLA首先进行计算图优化主要是跟机器无关的、高层的。如CSELoop Fusion等编译常用优化策略。下面出现的XLA计算图和及其优化的中间结果,可以通过设置环境变量来导出,然后转换一下即可。

CSE

我们先看看CSE(Common subexpression elimination)。我也把这出成了Byte Camp的题,由于我难以描述清楚题目,没被采用。其实这题很能打“我是搞深度学习的,为什么让我做这么多编程题”的脸。

假设我们在使用Tensorflow等编写神经网络时,为了使代码逻辑清晰,可能会写出如下运行时低效的计算:

在Tensorflow中可以表示为如下左图,其中 p1 / (p0 + (p3 - p4)) 计算了两次。XLA就能对此进行了优化,只需计算一次,计算流程被优化为如下右图形式。
 
我们可以通过简单的程序来完成这一过程,可以看到真实的Tensorflow代码才200行不到。这也是ICPC的一道题,有兴趣可以尝试一下。

Fusion

Fusion可能带来提升,有可能会降低效率。这跟计算和架构相关。但在神经网络和Nvidia的GPU架构下,很难出现效率降低。看一个简单的例子, np.sin(np.cos(a * b) + c) ,其中 a,b,c 都是矩阵。显然通过fusion,我们可以,

  1. 节省存储,提高cache利用率
  2. 减少kernel数

Fusion后的计算表示为CUDA代码,大概是:

可以看到本来要4个CUDA Kernel要完成的计算,Fusion之后1个就行了。这提升还是非常靠谱的,XLA也对此做了优化,如下图所示。显然可以带来计算效率的提升 (gpu额外开销比较大)。

Fusion后Fusion后


BERT XLA

前面的都是随便写的计算,现在可以看看BERT开启XLA后发生了什么。先放一张图。整个BERT的计算图太大了,放不下。这里是一层Transformer,不带训练的情况,其实也够看了(放大看)。

BERT,一层Transformer的计算流程

从上图,我们可以看到Layer norm、GELU都有很多细碎的操作,这如果没有优化会产生很多额外开销和中间结果,带来的后果就是显存占用高。而XLA将这些细碎操作都Fusion在一起了,形成了一个大的Kernel。开启XLA和FP16之后,训练效率是原来的4倍,直接起飞,可能这个加速比还不是理论极限。


XLA Client

还有一个比较有意思的是XLA Client。这非常硬核,我们可以直接将numpy代码转成在GPU上运行的代码,并且附带计算图优化,完成了下面几个项目大部分功能。

  1. https://github.com/andersbll/cudarray
  2. https://github.com/cupy/cupy
  3. https://devblogs.nvidia.com/numba-python-cuda-acceleration/
  4. https://github.com/dmlc/minpy

具体可以参考,

  1. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/compiler/xla/python/BUILD#L228
  2. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/compiler/tf2xla/python/xla.py
  3. https://github.com/google/jax

这里简单使用一下xla client(基于tf 1.13.1),由于这个功能还不稳定,这个代码随时跑不起来。

计算速度如下,

计算图我就不放了,这个页面太大了,已经很卡了。。。有兴趣可以自己输出计算图看看。

 

参考链接

  1. https://www.tensorflow.org/xla/overview
  2. http://pages.di.unipi.it/corradini/Didattica/PR2-B-14/OpSem.pdf
  3. https://www.cs.cmu.edu/~rjsimmon/15411-f15/lec/18-commonsub.pdf