找分布式工作面试系列---经典面试题第一弹(长期维护)

一、如何降低训练过程中的显存,有什么常用技巧?

https://www.zhihu.com/question/274635237
https://www.zhihu.com/question/461811359/answer/1916267649
https://zhuanlan.zhihu.com/p/56276946


降低内存
https://www.zhihu.com/question/278541750/answer/401822652

二、如何降低训练过程中的通信量、有什么常用技巧?

https://www.zhihu.com/question/382654702/answer/1135043420
https://zhuanlan.zhihu.com/p/103527044

三、如何达到增加机器数,训练速度呈线性增长的目的?

四、有什么数据读取加速的技巧?

https://zhuanlan.zhihu.com/p/72956595
https://zhuanlan.zhihu.com/p/80695364
https://zhuanlan.zhihu.com/p/138897998
https://www.zhihu.com/question/307282137/answer/907835663
https://www.zhihu.com/question/320804832/answer/1626454193
https://zhuanlan.zhihu.com/p/366595260
https://zhuanlan.zhihu.com/p/68191407
https://zhuanlan.zhihu.com/p/399076425
https://zhuanlan.zhihu.com/p/261222303
https://zhuanlan.zhihu.com/p/416942523
https://www.zhihu.com/question/445362239/answer/1740751492
https://zhuanlan.zhihu.com/p/261046643
https://zhuanlan.zhihu.com/p/408272573
https://zhuanlan.zhihu.com/p/261223141
https://zhuanlan.zhihu.com/p/342982918
https://www.zhihu.com/question/437167102/answer/2125853601

五、如何把gpu利用率打满?

https://www.zhihu.com/question/355004430/answer/1590239132
https://zhuanlan.zhihu.com/p/396658689
https://zhuanlan.zhihu.com/p/53345706
https://www.zhihu.com/question/383809585/answer/1116588351
https://www.zhihu.com/question/265963699/answer/301536513
https://zhuanlan.zhihu.com/p/410244780
https://www.zhihu.com/question/265963699/answer/301536513
https://www.zhihu.com/question/454589636/answer/1836794871
https://www.zhihu.com/question/337469435/answer/766388548
https://www.zhihu.com/question/361705113/answer/1622450547
https://www.zhihu.com/question/482031527/answer/2121743608
https://www.zhihu.com/question/443462237/answer/1735390255
https://www.zhihu.com/question/411956617/answer/1383789327
https://www.zhihu.com/question/448556597/answer/1774724045

六、介绍一下pytorch训练模型的机制?

七、动态图和静态图有什么区别?

https://zhuanlan.zhihu.com/p/194782375
https://www.zhihu.com/question/323859732

计算流与输入内容相关为动态图,只与输入类型相关是静态图。PyTorch可以看做解释型语言,以python本身为runtime,按步就班地执行每一个语句(算子),没有全局的图信息,从而损失了很多优化的机会(显存优化类比于寄存器分配,需要做一遍全图的liveness analysis)。优势在于灵活,比如根据矩阵某一个位置的值决定接下来进行哪一个分支;1.0之后的推出torchscript则是静态化的一个尝试,对于python的某个子集,支持编译到torchscript,其上可以进行一些编译优化。Tensorflow (1.0)是编译型语言,相当于在Python里定义一个tensor上的domain specific language,会根据输入的类型和计算图编译出相应的执行程序(中间可能进行了大量的编译器优化),理论上性能(速度和显存)都可以达到更优,但是损失了灵活性。可以类比于写python和写C++。

第一个区别:TF中在class里面就通过名称定义好了forward的流程,并通过placeholder留下输入接口之后run起来只要feed数据进去就可以了,如果网络shape不match, class init的时候就会报错。torch不同,他留下了函数接口,用户自己实现输入是什么,如果网络shape不match, 在调用forward时才会报错。第二个区别:因为tensorflow静态图,只留下feed接口,而图建立完毕之后,本身的数据流向无法观测,无法在任何一个name node debug(1.4),只能通过print打印shape诸如此类。torch是动态生产的数据流向,自然可以随时随地在某一个时刻停下来debug。
动态计算图在RNN循环网络中使用比较广泛。区别比较大的地方就是如果我们需要使用网络中间层作为判断依据来构建后面的网络。动态图就可以用类似Python执行顺序来编程,而静态图算法则需要使用特殊的框架语句,执行效率和方便程度都较动态图差很多。

image.png

TensorFlow and PyTorch, our two chosen frameworks, handle this computational graph differently. In TensorFlow, the graph is static. That means that we create and connect all the variables at the beginning, and initialize them into a static (unchanging) session. This session and graph persists and is reused: it is not rebuilt after each iteration of training, making it efficient. However, with a static graph, variable sizes have to be defined at the beginning, which can be non-convenient for some applications, such as NLP with variable length inputs.

On the contrary, PyTorch uses a dynamic graph. That means that the computational graph is built up dynamically, immediately after we declare variables. This graph is thus rebuilt after each iteration of training. Dynamic graphs are flexible and allow us modify and inspect the internals of the graph at any time. The main drawback is that it can take time to rebuild the graph. Either PyTorch or TensorFlow can be more efficient depending on the specific application and implementation.
From Stanford CS230 Section 5 (Week 5)
图包括了节点和边。这里假定节点代表layer,代表tensor。(反过来也差不多)
在节点层面,动态图与静态图的区别在于,前者中的一小部分layer可以在运行的时候进行定义。但是像卷积、全连接这种还是需要在创建模型的时候显示地进行确定超参数,例如:kernel size等。
在边的层面,二者区别更明显。对于动态图,只有在调用layer的forward时,才知道当前layer的输入来自哪个layer。当forward调用结束,这个拓扑关系就没了。然后下一次运行调用forward的时候再建立一次。而静态图,在模型定义的时候,就已经把图的全局拓扑确定了。
总之,简单来说,动态更多的体现在模型的拓扑上,在layer的定义上体现较少。
目前的深度学习框架很多都是动态静态都支持,例如:TensorFlow、Megengine、MindSpore。

不同输入

八、介绍一下lamb优化器、zero优化器?

九、有什么提高gpu计算速度的技巧?

十、在写pipeline的时候需要注意什么?

十一、介绍一下你知道的并行方式

数据并行、算子级模型并行、流水线并行等等

十二、介绍一下你知道的训练架构

基于参数服务器的训练架构以及allreduce这样的对等的架构这两类

十三、介绍一下你知道的参数同步方法/通信方式

有同步的算法也有异步的算法,当然实际应用场景中,基本上采用同步的算法。

十四、是否熟悉类MPI的通信编程,包括all-reduce、all-gather等,怎么进行集群通信调优

十五、是否熟悉资源调度,如k8s软件等,能否管理训练集群

十六、介绍一下你知道的硬件的集群架构,包括集群组网、内存大小、计算能力、通信带宽等。

(只有了解了硬件系统,才能比较准确的进行分布式训练的代价模型估计,才能比较好的进行模型的切分。实际上一种好的模型切分比不好的模型切分性能可能好上百倍。)

十七、介绍一下你知道的精度调优方法

精度调优涉及数据的处理和增强、超参设置和搜索、模型的结构优化等,对于工程师来说,精度调优过程中,要会检查代码和超参、检查模型结构、检查输入数据、检查loss曲线、检查准确率是否达到预期,一步一步实现精度目标,在分布式环境下进行精度调优还有其他额外的挑战,比如容易溢出、batchsize不好调等。

十八、介绍一下你知道的性能优化方法

:首先涉及单机的性能分析,比如通过profiling进行迭代轨迹的分析,包括获取数据的等待时间、前向和后向的执行时间;如果迭代间隙耗时占比较高,说明数据跟不上计算的处理速度,我们需要提升数据准备的性能;如果前向+反向阶段耗时占比较高,我们可以查看计算算子的耗时时长,分析是否有算子耗时不合理并针对耗时较长的算子做对应的优化。分析完单机性能,我们可以继续分析多机的集群性能,集群性能分析中比较关键的是集合通信操作,可以细分为通信等待(集合通信等待同步的时间)、通信耗时(集合通信数据传输与计算的时间)等阶段,我们需要这些信息来判断通信算子主要耗时是在通信还是在等待,同时针对通信链路,还可以细化看该链路上的通信数据量、通信耗时、链路类型等信息,观察集群中是否出现链路拥塞等问题。最后我们还可以分析资源使用情况,比如内存/cpu/npu的利用率,根据这些情况来调整分布式拆分策略。

十九、是否熟悉模型推理部署

推理部署,既能玩大的,也能玩小的,这里涉及到模型小型化、训练到推理的流程打通、一次训练多端部署的能力等等。

你可能感兴趣的:(找分布式工作面试系列---经典面试题第一弹(长期维护))