向量计算程序编译器
⑴ 开篇:XLA是什么
XLA (Accelerated Linear Algebra)是专用于机器学习的编译器,机器学习的运算中99%都是向量乘以矩阵、矩阵乘以矩阵的计算,XLA是专门用来优化这些计算的。
举个例子,运行在GPU上的 model_fn 函数会顺序调用 multiply 、 add 和 rece_sum 这三个op,而且 multiply ,也就是 y * z 的计算结果会先从GPU拷贝回host,再拷贝到device作为 add 的input,同样的,add的计算结果也会以相同的方式传递给下一个op。
显然,对于整个函数来说,将中间变量在host和device间来回倒腾是没有意义的。因此,如果把函数看作一个op,那在计算中产生的中间结果就不必返回到host,少了数据传输的时间开销,就可以大幅提升运算效率。
这种将多个op融合成一个op的方法就称为 fuse ,当前fuse的技术路线有:
XLA的优化当然不只是fuse,还有对计算图的优化,包括删除无效指令、减少内存占用、替换复杂指令等优化。下图是官方提供的性能报告,经XLA优化过后,Tensorflow BERT MLPerf的训练性能提升了~7倍。除了Tensorflow外,XLA还支持 JAX 、 Julia 、 PyTorch 和 Nx 等前端。
jit 是指在首次运行时将函数编译成二进制程序,后续再调用该函数时直接运行先前编译好的程序而非python code。 @tf.funciton 修饰的函数(包括它的子函数)会做 jit 。除非signature发生了变化,也就是input的shape或dtype和编译时不同,否则 get_MSE 是不需要重复编译的。
@tf.function 将函数内的ops替换成一组( XlaCompile , XlaRun ) ops,在运行时前者负责编译,并将编译结果-- executable 保存到cache,后者负责运行executable。如果cache里已经有编译好的程序就不需要编译了,例如 get_MSE(tf.constant(3.0), tf.constant(4.0)) 。
XLA编译器支持的语言(IR)是HLO(High Level Operations),顾名思义这些语言是由一个个op组成,因此,我们在编译前需要先从python code中提取出所有ops,再将它们转换成HLO。
JAX通过tracing的方式,从 @jax.jit 修饰的函数中提取ops,这些ops通过 jaxpr 来表示。然后再通过XLA client提供的API为ops生成相应的HLO。PyTorch/XLA也是采用类似的方法来生成HLO。
Tensorflow的 tf2xla 为每个 Op 创建了一个同名的 XlaOp 用于生成HLO, XlaOp 派生于 Op ,使用相同的注册机制,因此,只要把要编译的子图根据拓扑排序运行一遍就能生成它的HLO。
HLO先经过一系列 pass 优化后再将HLO lowering成ISA,最后将编译好的二进制封装到 executable 。
除了二进制程序,它还包含运行该程序所需要的infos和options。调用 executable.run() 就可以执行计算图。
⑵ 瀛︾敓𨱒ョ湅10涓链浣崇殑Ph缂栬疟鍣
10涓链浣崇殑Python 缂栬疟鍣ㄥ拰瑙i喷鍣
链濂界殑Python缂栬疟鍣ㄥ拰瑙i喷鍣
1.Bry thon
Javascript浠g爜銆傚畠鎻愪緵瀵规墍链塛eb娴忚埚櫒(鍖呮嫭涓绉嶆坠链
瀹冭缮鏀鎸佹渶鏂扮殑Html 5/CSS 3瑙勮寖锛 鍙浠ヤ娇鐢ㄦ祦琛岀殑CSS妗
Bry thon鏄涓绉嶆祦琛岀殑Python缂栬疟鍣锛 鍙灏哖ython杞鎹涓
Web娴忚埚櫒) 镄勬敮鎸併
鏋讹纴 濡侭ootStrap 3鍜孡ESS銆
缃戝潃锛歨ttps锛//brython.info
2.Py js28
Py js鏄涓涓涓板瘜镄処n tem net搴旂敤绋嫔簭妗嗘灦锛 涔熸槸涓绉嶈交閲忕骇
镄凯ython缂栬疟鍣锛 鍙浠ヤ粠Web娴忚埚櫒鐩存帴镓ц孭ython鑴
链锛屽彲浠ヤ粠娴忚埚櫒镄凧S鎺у埗鍙版墽琛岀▼搴忋
瀹冩槸浠嶱ython鍒癑avascript镄勭紪璇戝櫒锛 鍙浠ヤ娇浠g爜鍦╓eb
娴忚埚櫒涓婅繍琛屻傚畠甯︽湁Ajax妗嗘灦鍜学idget Set API銆
缃戠珯锛歨ttp锛//pyjs.org
3.Win Python
瀹冩槸涓篧indows镎崭綔绯荤粺璁捐$殑銆傚畠链変竴浜汣Python镄勭壒镐
銆傚畠棰勮呬简涓浜涢拡瀵规暟鎹绉戝﹀拰链哄櫒瀛︿範镄勬祦琛屽簱锛屼緥濡
Numpy銆丳andas鍜孲cipy銆
瀹冨甫链塁/C++缂栬疟鍣锛屽ぇ澶氭暟镞跺欎笉浼氱敤鍒般傞櫎姝や箣澶栵纴瀹冨彧
链埘ython缂栬疟鍣锛 娌℃湁鍏跺畠鍖呫
缃戝潃锛歨ttps锛//winpython.github.io
4.Sku lpt
Sku lpt鏄疨ython镄勬祻瑙埚櫒鐗埚疄鐜帮纴 鍙浠ヨ娣诲姞鍒癏TML浠g爜
涓銆
姝Python缂栬疟鍣ㄤ娇鐢↗avascript缂栧啓锛 鍦ㄥ㈡埛绔杩愯屼唬镰侊纴
镞犻渶鍏跺畠鎻掍欢銆佸姞宸ユ垨链嶅姟鍣ㄦ敮鎸併
Sku lpt瑙i喷鍣ㄩ氲繃瀵煎叆鏂瑰纺锛 𨱒ユ墽琛屼缭瀛桦湪缃戠珯涓婄殑.py鏂囦欢
涓镄勪唬镰併
缃戠珯锛歨ttps锛//skulpt.org
5.Shed Skin
璇ョ紪璇戝櫒灏哖ython镙囧嗳搴撴ā鍧楃紪璇戜负C++锛 瀹冨皢闱欐佺被鍨嬬殑
Python绋嫔簭杞鎹涓哄緢鍙楅檺镄勪紭鍖栫殑C++浠g爜銆
阃氲繃灏嗗叾鍐呯疆镄凯ython鏁版嵁绫诲瀷鍐嶆″疄鐜颁负镊宸辩殑绫婚泦(鍙
浠ョ敤C++楂樻晥瀹炵幇)锛屽彲浠ユ彁楂樻ц兘銆
缃戠珯锛歨ttps锛//en.wikipedia.org/wiki/Shed_Skin
6.ActivePython
杩欐槸鐢ㄤ簬Windows銆丩inux鍜孧acOs镄凯ython鍙戣岀増锛 链
鍏嶈垂镄勭ぞ鍖虹増銆
瀹冩敮鎸佸湪璁稿氩钩鍙板畨瑁咃纴 镆愪簺涓嶈玃ython-like镄𪞝IX鏀鎸佺殑
骞冲彴锛 瀹冧篃鏀鎸併傚畠鎻愪緵浜嗘瘆Python镟村氱殑鍏煎规с
缃戠珯锛
https锛//www.activestate.com/procts/activepython
7.Trans crypt
瀹冩槸涓绉嶆祦琛岀殑灏哖ython浠g爜缂栬疟涓虹亩鍗曟槗璇荤殑Java浠g爜
镄勭紪璇戝櫒銆傚畠鏄涓涓杞婚噺绾х殑Python缂栬疟鍣锛 鏀鎸佸圭烦阒靛拰
钖戦噺杩愮畻杩涜屽垏鐗囥
Trans crypt涔熷彲浠ュ湪Node.js涓婅繍琛屻傚垎灞傛ā鍧椼佸氶吨缁ф圹鍜
链鍦扮被缁椤叾娣诲姞浜嗗緢澶氩姛鑳姐
缃戠珯锛
https锛//www.actvestate.com/procts/activepython
8.Nut ika
杩欐槸涓绉嶆簮镰佸埌婧愮爜镄凯ython缂栬疟鍣锛 鍙浠ュ皢Python婧愪唬
镰佽浆鎹涓篊/C++鍙镓ц屼唬镰併傚畠浼氢娇鐢ㄥ埌璁稿歅ython搴揿拰镓
灞曟ā鍧椼
瀹冭嚜甯Anaconda锛 鍙鐢ㄤ簬鍒涘缓鏁版嵁绉戝﹀拰链哄櫒瀛︿範椤圭洰銆
缃戠珯锛
https锛//www.activestate.com/procts/actvepython
9.Jython
瀹幂敤Java缂栧啓锛 鍙浠ュ湪杩愯孞VM镄勪换浣曞钩鍙颁笂镓ц屻
Jython灏哖ython浠g爜缂栬疟涓筼ava瀛楄妭镰侊纴 浠庤屽仛鍒拌法骞冲彴
瀹冨彲鐢ㄤ簬鍒涘缓Serve lets銆丼wing銆丼WT鍜孉WT杞浠跺寘镄勮В鍐
鏂规堛侸ython浣跨敤CPython涔嬬被镄勫叏灞瑙i喷鍣ㄩ挛(GIL)
鍙﹀栵纴 浣犲彲浠ュ皢Java绫绘墿灞曞埌Python浠g爜銆
缃戝潃锛歨ttps锛//www.ython.org
10.CPython
CPython鏄榛樿ょ殑涓斾娇鐢ㄦ渶骞挎硾镄凯ython缂栬疟鍣ㄣ傚畠鏄鐢–
璇瑷缂栧啓镄勶纴 骞朵娇鐢℅IL(鍏ㄥ眬瑙i喷鍣ㄩ挛) 锛 杩欎娇寰楀苟鍙
CPython杩涚▼涔嬮棿镄勯氢俊寰埚汹闅俱
CPython涓镄勭紪璇戞ラゅ寘𨰾锛氲В镰併佷护鐗屽寲銆佽В鏋愩佹娊璞¤娉
镙戝拰缂栬疟銆
缃戠珯锛歨ttps锛//compilers.pydata.org