airflow

issue when using airflow

file access is slow when using cloud storage

airflow keep scanning dags folder for representation of the airflow. those files must be scanned often in order to mantain consistency between the on-disk source of truth for each workload and its in-database representation this means the contents of the DAG directory must be consistent across all schedulers and workers in a single environment

作者:ZZZZJ 链接:https://www.zhihu.com/question/356661099/answer/2449633440 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我写过一个20行的kernel。完全没有复杂数学计算,就是把特定数据从一个地方搬到另一个地方。写这个kernel 估计用了半天。在review 的时候,我被问到这样几个问题。解决这些问题花了我半年。这个kernel 是 memory bound 还是 compute bound ? 这个容易,直接理论解释一下就好。配合 nvprof/ncu report。如果是memory bound, 现在这个实现的throughput 是多少?这个时候我就得拿nvprof/nsight 去把一些指标拿出来,并且针对这个问题认真算一下我到底access 了多少数据。你的代码真的在做你让它做的事情吗?比如我在代码里展开循环, 展开了8次。但是有可能register 不够用,在编译的时候只能展开6次。你怎么证明编译出来的代码在做你让他做的事情?memory bound 具体在gpu 上的哪一块儿遇到了瓶颈?DRAM ? L1? L2? 这个时候上面的指标就不够用了,我得去找细化的指标,然后算 hitrate,算cacheline 的大小,算我们每个计算单元上能跑多少线程。这些指标就一定是对的吗?互相之间能相互佐证吗?和我们的预期相符吗?比如L1 hitrate 汇报说是30%。但是我在load data 完全没有复用,理论上应该没有L1 hit,这30% 哪里来的?针对以上的瓶颈,理论上的上限是多少?然后我就要去找英伟达发布的硬件数据, 根据这些数据算出来理论上限。接下来的问题是,你怎么证明这些理论上限是正确的。于是我又要些一些microbenchmarking 证明我算出来的理论上限是可以达到的,并且理解了在要达到这些上限需要怎样的条件。我们现在这个实现是不是达到了理论上的上限?有没有硬件上的一些特殊指令能够让我们跨越理论上限?比如LDGSTS,能够跨越L1,比如 reduced precision 能够省带宽,比如vectorization,能够增加load in flight。写优化代码水还是很深的。

作者:谷俊 链接:https://www.zhihu.com/question/20722310/answer/24824346 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其实你可以把显卡想象成另外一台机器。那么控制另外一台机器的办法,就是往它的内存里面写指令和数据。往一块内存里面写东西的办法无非就几种,1, 用CPU去做,那么就是用MMIO(Memory Mapped IO)把’显存’ map到CPU寻址空间,然后去读写,2, 用DMA控制器去做,这里面有系统自带的DMA控制器或者显卡带的,不管哪种你可以把DMA控制器再一次看作另外一台机器,那么其实就是向DMA控制器写指令让它帮你传一些东西到显存去,传的这些东西就是显卡要执行的命令和数据。显卡上的内存控制器,原来AGP的时候叫GART,现在不知道叫啥名了,另外SoC里面也有类似的概念,不过大多数SoC只有一个内存控制器,所以不分显存和内存。把显卡想象成另外一台机器。它要工作,无非也是“程序存储”原理,上电之后,从特定的内存(显存)地址去取指,然后执行指令。显卡的工作逻辑比CPU简单多了,它一般就从一个环形buffer不断的取指令,然后执行,CPU就不断的去往环形buffer填指令。很多时候同一个动作既可以用MMIO,也可以用DMA,比如flip framebuffer。只要把flip framebuffer的指令正确传到环形buffer就好了。但是MMIO需要CPU参与,传大数据的时候,打乱CPU GPU并行性,划不来。驱动程序其实也是围绕着这件事情来做的,Vista以前,显卡的驱动全都是kernel mode执行的,因为只有kernel mode才能访问的物理地址,但是kernel mode的坏处是一旦有问题,系统就崩溃,而且kernel mode有很多局限性,比如没有C库支持,浮点运算很难,代价很大等等。所以Vista之后,显卡驱动都分两部分,kmd负责需要访问物理地址的动作,其他事情都放到umd去做,包括API支持等等。所以一个3D程序执行的过程是这样的,app generate command, call D3D runtime,D3D runtime call driver umd, driver umd system call driver kmd, kmd send command to ring buffer, graphic card exeute.至于显卡驱动要完成什么部分,这个就是所谓HAL(hardware abstraction layer)层,也就是说HAL以下由厂商提供,以上就是操作系统自带,在HAL层以上,所有的操作都是统一的,比如画一个点,画一条线,驱动来对应具体的某一款芯片生成真正的命令,比如画点,需要0x9指令,把绝对坐标放到地址0x12345678(举例)。微软管的比较宽,umd, kmd都有HAL层,意思是即使kmd你也不能乱写,能统一的尽量统一,比如CPU GPU external fence读写同步机制就是微软统一做的。流处理器就是说,那些处理器可以执行很多的指令,而不是就几个固定的功能,比如原来我把几个矩阵的乘法固定成一个操作(比如T&L单元),现在我把这个操作拆了,改成更基本的指令,比如,取矩阵元素,加乘,这样更灵活。不过你就得多费心思去组合这些指令了,组合这些指令有个高大上的名字,shader。至于为什么叫shader,越来越长了,不说了

关于umd和kmd我想补充一些。

微软从WDDM模型开始将驱动层分离成user mode和kernel mode两层还有一个重要的原因是关于性能的。IHV提供的OpenGL驱动一直都是分成两部分的,一部分做API接口的实现,一部分直接访问硬件;而Vista之前的Direct3D,IHV只提供kernel部分的驱动,user mode部分的API接口实现由D3D runtime负责。这里带来的一个问题就是当runtime call 驱动的时候,其实是一个expensive的system call。将D3D API call存在一个缓冲区,然后一次性dispatch给kmd以减少system call的次数是一种能大大提升性能的优化手段,叫做 marshalling。

然而,由于在WDDM之前IHV只提供DirectX的kmd而无法控制user mode的D3D runtime 部分,这种优化就无法实现。这部分细节可以详见 Comparison of OpenGL and Direct3D。

直到Windows Vista开始采用WDDM模型,IHV提供的驱动变成了umd和kmd两部分;umd实现处理D3D runtime的API call,把API call转换成显卡能识别的micro code,申请内存空间,编译shader等等工作;kmd实现内存管理,将command放入ring buffer,显示管理(这个一般叫做Display Abstract layer,DAL)等等。

如果有说的不对的地方,欢迎指正。

PS. Microsoft的fence一直不怎么好用,IHV在实现驱动是umd和kmd都会有自己的fence。。。很多bug都是这么来的。。。orz

PPS.原本我打算回答这个问题的,一直觉得自己理解的还不够,打算想明白了在发出来。。。没想到这个问题突然就火了。。。大家回答的都比我好。。。只好默默的去把我的草稿删掉了。。。

  1. performace a. page static + CDN b. cache - warm up, 用redis顶住, db在 c. 异步化
Written on March 17, 2023