【每日一书】5.19 分布式机器学习-算法,理论与实践

即刻链接: https://web.okjike.com/originalPost/628614f7150c9c7214696b32

5.19 分布式机器学习-算法,理论与实践

这本书入手于2018年11月17日,当年12月10日读完。可以作为分布式机器学习的入门书。

书中介绍了分布式机器学习框架的一些基础知识,包括单机优化,数据模型并行,通信机制,分布式机器学习算法和一些系统。系统主要介绍了基于IMR,基于参数服务器和基于流的机器学习系统。

TensorFlow 在2017年发布eager的时候,我在现场,觉得这是一个变革,回去就做了一个分享。 当时的PyTorch还不成气候,没想到今天会有如此地位。

当时我还去看过TensorFlow的代码,想想能不能贡献点代码。那个时候,NLP训练数据量不算多,很多时候一台机器+fasttext搞定,对分布式训练不了解,就去读了一下代码。

分布式机器学习主要有三个场景:
1. 计算量太大
2. 训练数据太多
3. 模型规模太大

现在就NLP的发展,像BERT和其变种,还有GTP-3这种面向生成的大模型,上面三个场景都占了。

BERT出来的时候,还能折腾折腾,8块V100跑一跑,像后面的大模型就只有等API了。我也变成做AI落地的了。

像IMR的系统,同步+数据并行,Spark MLlib都算比较简单的,属于大数据平台变化过来的。

基于参数的服务器,目前还是有很多开源项目的,Multiverso、PS Lite、KunPeng等等。

基于流的,目前是主流,一个有向无环图定义,可以灵活的数据并行,模型并行或者混合并行。

像Tesorflow、Pytorch、Paddle都属于基于流的,后面的趋势就是支持大规模训练的框架,像OneFlow就是以兼容Pytorch,一键分布式加速为亮点。

还有一个趋势,就是云原生的训练架构,把训练任务完全微服务化。后面看看发展吧。

我自己有个FAI的框架想法,目前还处于调研和开发阶段,还没开源,是基于Rust来实现的一个非常简单的深度学习框架,希望后面能完成和开源出来。

分布式机器学习框架论文很多,没法推荐。我就推荐一下,李沐老师在B站讲了两节课,讲PS架构和最新的Google Pathways架构,可以看看。

1.参数服务器(Parameter Server)www.bilibili.com
2.Pathways www.bilibili.com

【每日一书】5.18 人工智能与游戏

即刻链接:https://web.okjike.com/originalPost/6284c15c360fb4affaec764e

#每日一书# 加入的第一天,搞个新玩法。 随手拍一张,手上正在读的书或者身边已经读过的书,然后说说与这本书的故事。

5.18 人工智能与游戏

入手时间2021年8月,目前粗略读过一遍,正在根据这本书的内容写GameAI专栏。

专栏目前有9篇,书中内容太概括,一页内容就可以花很多时间去扩展,专栏有种给自己挖坑的感觉。

为什么读这个? 因为要做GameAI方向的产品,对游戏AI的传统方法不怎么熟悉,想有一个整体的视角。

这本书可能今年才能读完,因为还要为专栏做一个演示程序,包括了传统的方法,机器学习算法,深度学习和强化学习的一些demo,这工作量不小。

除了这本关于游戏AI的书外,我还有另外3,4本书,还有一些论文,后面再介绍。

08.DPU网络开发SDK—DPDK(七)

接上次内容继续对rte_eal_init()所做的工作进行分析。
 
24. 内存初始化
24.2. 内存分配
调用eal_memalloc_init()来处理内存分配,前半部分根据进程是primary还是secondary走不同的流程,后半部分两者相同。

前后两个初始化过程中,用到了一个特殊的func,rte_memseg_list_walk(),该func的传入参数是一个rte_memseg_list_walk_t类型的函数指针及void *通用指针。在list_walk()中,会对rte_config.mem_config.memsegs列表中每一个memseg list依次调用函数指针指向的函数,且保证了整个过程中是在mem_config.memory_hotplug_lock锁的保护下进行的。

  • 以secondary方式
通过list_walk()来调用secondary_msl_create_walk()来为每个memseg list分配内存,该func中,根据primary的memseg list的大小,初始化一个local_memsegs结构,初始化还是调用rte_fbarray_init()来实现。primary的memseg list的大小从mem_config.memsegs获取到。

  • 以primary方式
该过程中,通过test_memfd_create执行memfd_create系统调用,测试当前系统是否支持创建匿名的内存共享,检查结果根据当前系统的一些配置情况决定是否以错误退出。

分primary和secondary之后,不管哪种方式初始化,都会执行fd_list_create_walk()。create_walk()对每个memseg list调用alloc_list(),alloc_list()会初始化文件描述符列表数组fd_list,每个memseg list对应一个数组项,数组项中会指向一块内存,用于存储文件描述符,这里的文件描述符即为匿名内存共享文件的描述符。

24.3. 初始化大页
初始化大页同样分primary和secondary

  • 以primary方式
调用rte_eal_hugepage_init(),如果internal_config设置了legacy_mem,那么调用eal_legacy_hugepage_init(),否则调用eal_dynmem_hugepage_init()。

 A. eal_dynmem_hugepage_init()
对于每一种大小类型的大页,确定好每个socket上页面的数量;统计出每个numa node上的内存大小;根据这些信息调用eal_dymem_calc_num_pages_per_socket()最终确定每种大小类型的页面的数量。

确定好这些信息之后,多次调用eal_memalloc_alloc_seg_bulk()来映射页面,该func通过list_walk()调用alloc_seg_walk()来完成这些工作。

B. eal_legacy_hugepage_init()
分为两种情况执行,一种禁用hugetlbfs情况下,另一种是在启用情况下。
 
a. 禁用hugetlbfs
此时允许的内存大小为64GB,页面大小为4KB,以此得出所需要的一个页面数量之后,调用eal_memseg_list_init_named()来重新初始化mem_config.memsegs[0]这个memseg list。然后通过eal_memseg_list_alloc()间接调用eal_get_virtual_area()为memseg分配虚拟地址,下一步通过mmap()系统调用创建匿名映射并获得匿名映射地址addr,接下来通过eal_memseg_list_populate()填充mem_config.memsegs[0]这个memseg list,以addr为基准计算出每个memseg的地址,填到相应的结构体中。
 
b. 启用hugetlbfs
首先统计出用了哪几种大小类型的大页内存,并且计算出总的大页内存页面数量,分别存放在used_hp数组和nr_hugepages当中。接下来开辟一块内存tmp_hp,用于存放nr_hugepages个struct hugepage_file结构,hugepage_file结构用于存放一些信息,比如该大页被映射到进程地址空间的哪个虚拟地址,大页物理地址是多少,所属socket_id是多少。

接下来,对于每一种页面大小类型的大页,做如下操作:

1.调用map_all_hugepages()映射该大小类型的所有大页,具体做法是调用open()打开大页在/sys文件系统中的文件,然后mmap()之后获取一个虚拟地址,并记录在结构体当中。

2.如果启用了物理地址,且IOVA的模式不是VA,那么调用find_physaddrs()获取到每个大页的物理地址并保存下来,否则调用set_physaddrs()设定一个伪物理地址。

3.调用find_numasocket()确定每个大页所属的socket_id。

4.根据物理地址将tmp_hp进行排序。

接下来根据tmp_hp中的信息,统计出每个socket每种大小类型的大页的数量,更新这些信息更新到internal_config.hugepage_info结构体当中,并最终确定每个socket下大页的数量。

接下来调用create_shared_memory()创建一个共享文件,大小为nr_hugepages个struct hugepage_file结构体,路径为/var/run/dpdk/rte/hugepage_data;接下来调用copy_hugepages_to_shared_mem()将该进程中分配到的大页信息写入到该文件当中。需要指出的是,到此为止所需要分配的内存就分配完了,后续不会再根据需要再额外分配大页内存,即使在DPDK进程运行过程中遇到内存耗尽的情况,所以在最后的收尾工作中,会将一些不需要的memseg list做释放处理。

  • 以secondary方式
调用rte_eal_hugepage_attach()来实现,同样分为是否设置了lagacy_mem,分别调用eal_legacy_hugepage_attach()和eal_hugepage_attach()

A. eal_legacy_hugepage_attach()
打开primary进程创建的文件/var/run/dpdk/rte/hugepage_data,并读取相应的信息,该文件的是多个hugepage_file结构体。对于每一个结构体中包含的信息,通过mmap()将大页内存还原到当前secondary进程当中,并以此初始化memseg list。

B. eal_hugepage_attach()
调用eal_memalloc_sync_with_primary(),该func会调用sync_walk()。sync_walk()会根据primary进程中的memseg list信息初始化自己的memseg list。sync_walk()会调用sync_existing()去打开/sys文件系统中的大页文件去确认已经被primary分配的内存和未被primary分配的内存跟memseg list中的信息是一致的,在确保一致的情况下才可以进行后续工作。
未完待续… 
往期回顾:
07.DPU网络开发SDK—DPDK(六)
06.DPU网络开发SDK—DPDK(五)
05.DPU网络开发SDK—DPDK(四)

Day127: 每日漏洞挖掘——5.7

1.Bypass Rate Limit — A blank space leads to this random encounter!

https://infosecwriteups.com/bypass-rate-limit-a-blank-space-leads-to-this-random-encounter-e18e72fbf228

2.记首次HW|某地级市攻防演练红队渗透总结

https://xz.aliyun.com/t/11300

3.SignUp functionality hunting mindmap


https://pbs.twimg.com/media/FR_LtLgWQAAMisI?format=jpg&name=4096×4096

4.Nuclei: Packing a Punch with Vulnerability Scanning

https://bishopfox.com/blog/nuclei-vulnerability-scan

5.Ferrari subdomain hijacked to push fake Ferrari NFT collection

https://www.bleepingcomputer.com/news/security/ferrari-subdomain-hijacked-to-push-fake-ferrari-nft-collection/

漏洞分析

  1. https://hackerone.com/reports/1181946 分析:https://youst.in/posts/cache-poisoning-at-scale/
  2. https://hackerone.com/reports/927338 利用图片的元数据来定位
  3. https://hackerone.com/reports/1250474 绕过line的2FA
  4. https://hackerone.com/reports/1173153 cache-poisoning-at的又一例

挖掘进度

私有项目的Recon

《原则》笔记——生活原则4:理解人与人大不相同

生活原则4: 理解人与人大不相同

因为人的大脑结构不同,人和人天生有擅长和不擅长的差别。

读书厉害的人通常不等于需要的聪明人。想招聘的人是独立的思考者,有创造力,概念性强,常识性强

4.1 明白你与其他人的思维方式能带来的力量
a.我们拥有各种天生特征,既可能帮助自己也可能伤害自己,取决于如何应用。

大多数特征都是“双刃剑”,可能带来好处和害处。特征越极端,它可能带来的好处或害处就越极端。

  • 创造性和目标导向的人: 擅长新主意,能会低估日常生活细节的价值
  • 任务导向的人: 善于处理细节,但是可能会低估创造性的价值


4.2有意义的工作和有意义的人际关系不仅是我们做出的美好选择,而且是我们天生的生理需求

脑的构造先天使人需要并享受社会合作。人脑的进化史是从本能、关注自身发展为更抽象、更关注普遍的事物。

所以人都是需要生活在社会中,都需要社交。


4.3理解大脑里的主要斗争,以及如何控制这些斗争,以实现“你”的愿望
a.要明白,意识与潜意识在不断斗争。

我们的灵感大爆发往往就是从潜意识区域“喷出”的。我们经历这些创造性突破的时刻,通常是在放松、不试图与它们所在的大脑区域(通常是新皮层)沟通的时候。

大脑里面有两个你在打架。能激发创意的是,是放松的时候,包括淋浴和冥想。

我每天冥想试试。

b.要知道最常发生的斗争是情绪和思考的斗争。

情绪: 主要是由潜意识性的杏仁核控制的

理性思考: 主要是由意识性的前额皮层控制的

情绪其实就是一种被杏仁核绑架了,遇到危险,与人争论的生理反应。主要是我们不能放任本能反应,因为可能会反应过度。

确实,我们需要控制本能反应,比如演讲紧张,投资等等。


c.调和你的情绪和思考。

需要引导个人进化,是需要经常思考,为什么会被杏仁核绑架。当时出现了什么,然后还要采取措施去避免。 比如,很多人会控制不了情绪,暴跳如雷,打人等,也是被绑架了。


d.善择你的习惯。

习惯是由大脑底部的基底核驱动的,那是一块高尔夫球大小的组织。基底核控制着你的行为,但它藏得很深,本能地运行,所以你意识不到它。

想要养成习惯,需要反复练习,产生自控力。你需要明白大脑是如何工作的,养成更好的习惯。

要认识到习惯是怎么产生的。 习惯其实是一种惯性,把一直做的事情继续做下去,这个时间是18个月。


e.坚持友善地训练“较低层次的你”,以养成好的习惯。

需要友善的训练本能,情绪化的自我,训练它才能养成好的习惯。而好的习惯是不需要想就可以执行的,这也算是一种本能。


f.理解右脑思维和左脑思维的差别。

左脑: 顺序推理,线性思维

右脑: 识别主题,发散思维。


g.理解大脑可以改变的程度。

近年来的研究显示,从身体锻炼到学习冥想,很多种练习都能给人脑带来物理性和生理性变化,从而影响人的思维与记忆能力。

改变的最好方法是做心理练习。

4.4认识自己和他人的特性
a.内向与外向。

  • 内向: 聚焦于内向世界,从思想,记忆和经验中汲取能量。
  • 外向: 聚焦于外部,从与人相处中汲取能力。


b.直觉与感知。

  • 直觉者: 全局
  • 感知者: 细节


c.思考与感觉。

  • 思考者: 理性分析客观事实,考虑所有与具体情况相关的已知、可证明因素,富有逻辑性地决定如何行动
  • 感觉者: 关注人与人之间的和谐,他们最好从事一些需要很多同理心、人际沟通、关系构建的工作


d.计划与发觉。

  • 计划者: 喜欢专注于计划并遵行
  • 发觉者: 观察情况,然后往前分析原因,寻找应对办法。他们还会看到可以对比、选择的多种可能性,经常因看到太多可能性而无所适从


e.创造者、推进者、改进者、贯彻者与变通者

  • 创造者:提出新想法,新概念。 喜欢非结构化,抽象,喜欢创新和不走寻常路。
  • 推进者: 传递这些新想法并推进。他们喜欢感觉和人际关系,管理各种人的因素。他们非常善于激发工作热情。
  • 改进者: 挑战想法。他们分析计划以寻找缺陷,然后以很客观、符合逻辑的方式改进计划。他们喜欢事实和理论,以系统性的方式工作。
  • 贯彻者也可以叫作执行者: 他们确保重要的工作得到执行,目标被实现。他们关注细节和结果。
  • 变通者是以上4种类型的结合。他们能根据特定需求调整自身,并能从各种各样的视角看待问题。


f.关注任务与关注目标

关注任务: 善于管理没有什么变化,按部就班的事物。

关注目标: 能看到逐渐变化的大局,也更有可能做出有意义的改变,预估未来的事件。最适合创造新东西(新组织、新计划等),管理频繁变化的组织


g.职场人格量表。

主要关注一些品质比如: 毅力、独立性、抗压能力、分析能力等,预测员工行为和工作适配性、满意度。

是为了了解员工的一些人格特质。


h.塑造者是能从构想一路走到构想实现的人。

塑造者: 能提出独特和有价值的愿景,并以美妙的方式实现愿景(通常是在他人的质疑之下)。塑造者既能看到全局,也能看到细节。

塑造者通常有一些共同特征:极富好奇心;有把事情弄清楚的强烈冲动;近乎叛逆地独立思考;需要宏大别致的梦想;务实并坚毅地排除万难、实现目标;了解自己和其他人的长处和短处,所以能协调团队来实现目标。也许更重要的是,他们能同时持有相互冲突的想法,并从不同角度来看待这些想法。他们通常喜欢和其他真正的聪明人一起探索,能在全局和细节之间自如地来回跳跃,并相信二者同样重要。

你最需要的勇气不是驱使你战胜别人的勇气,而是不管其他人对你有何冀望,你始终坚持做最真实的自我的勇气。


4.5无论你要实现什么目标,让合适的人各司其职以支持你的目标,是成功的关键
a.管理你自己,并协调其他人实现你的目标。

管理你的本能,养成好的习惯。然后让各种不一样的人帮助你实现你的目标。