- 博客(40)
- 资源 (1)
- 收藏
- 关注
原创 并行算法设计与性能优化
处理器特性处理器的并行特性包括:指令集并行向量化并行线程级并行缓存优化了解目标处理器的特性才能写出高质量的代码。现代处理器的运算速度远快于内存读写速度,为了减少访问数据的延迟,现代处理器主要采用了以下两种方式:利用程序的局部性,将正在访问或者即将访问的数据放到缓存当中。利用并行性,在一个高延时的指令阻塞的时候,执行另一个控制流。现代乱序多核处理器与许多与代码优化相关的特性:指令集并行:流水线,多发射,VLIW,乱序执行,分支预测矢量化:SIMD线程级并行缓存层次
2021-05-13 09:56:00 1188
原创 TVM引发的思考
引言TVM不仅仅是一个编译器,也可以看做一个编程模型。他的计算与调度分离的哲学使得用户无需关心后端代码的执行优化。TVM 如何对算子进行优化?TVM针对CPU、GPU、ASIC(FPGA)三个硬件后端做了统一的端到端的后端优化,现在我们剥离图优化层,单拎出来对不同后端的算子优化做出解释。不同的硬件特性导致对统一个算子的优化也会有不同的影响,FlexTensor文章列出了针对不同后端的优化技术。TVM对不同的优化技术提出了多种调度原语,包括:...
2021-05-13 09:55:08 194
原创 《Better Performance at Lower Occupancy》解读
背景CUDA的通常建议在SM或者Block中使用更多的线程来隐藏访存时延。但是作者提出这种方式可能不是完全正确的这种方式可能不是完全正确的这种方式可能不是完全正确的作者列举了两个实验数据来说明这件事情,结果一目了然:作者提出使用CUDA编程时的两点谬论:多线程是隐藏时延仅有的一种方式。这里的时延包括两种:一种是算数延时;一种是访存延时shared memroy 和 register 的访存速度一样快优化点1:使用更少的线程来隐藏计算延时首先将计算延迟与访存延迟做一个对比,计算延迟要
2021-05-06 10:54:44 7787 3
原创 2021-04-10
MLSYS2021会议已经结束了,会议的文章发布在https://proceedings.mlsys.org/paper/2021,自行享用
2021-04-10 08:50:56 609
原创 算法与数据结构(回溯算法)
回溯算法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。 但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。代码模板:通常为了记录路径我们会采用一个path来记录访问的路径,当访问结束后将path中的数据回退。回溯代码流程大概如下面所示:// 通过path记录路径void backtrace(string s, vector<string>& path, vector<vector<str
2020-12-08 13:48:21 138
原创 GPU集群管理系统
开源项目microsoft PAIalibaba/GPU-scheduler-for-deep-learning,论文“AntMan: Dynamic Scaling on GPU Clusters for Deep Learning”的实现
2020-12-08 11:34:50 1612
原创 算法与数据结构(区间合并)
区间合并区间合并主要是用来处理有区间重叠问题的算法例如:lc 56、lc 986算法的关键点就是:按照区间的左端点排序,因此在排完序的列表中,可以合并的区间一定是连续的。vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end()); vector<vector<i
2020-12-07 16:58:26 300
原创 golang经典面试问题汇总
golang内存模型Go的内存模型描述的是"在一个groutine中对变量进行读操作能够侦测到在其他goroutine中对该变量的写操作"的条件,简单地说是“对多个协程中共享的变量,一个协程中怎样可以看到其它协程的写入。”当多个协程同时操作一个数据时,可以通过管道、同步原语 (sync 包中的 Mutex 以及 RWMutex)、原子操作 (sync/atomic 包中)。happens-before概念:happencs-before有两个易混淆的点:一个对变量v的读事件r可以 感知到另一个对变
2020-12-07 16:19:26 450
原创 调度器工程:如何开发一个调度器
基于k8s的调度器开发GPU集群管理相关的开源项目k8s扩展调度的方式:(1)scheduler-extender (2)scheduler-framework传统的scheduler-extender的缺陷:扩展点数量的限制:仅支持 “Predicate”、“Priority”、“Bind” 三个扩展点。即可以在这三个阶段进行扩展,但扩展的功能只能在默认的功能之后被调用。例如当增加了新的 “Predicate” 功能后,开发者只能在默认所有预选函数执行完成之后才能调用它,不能够在这之前进行调用;
2020-12-04 16:27:44 247
原创 算法与数据结构(KMP算法)
字符串匹配算法KMP如leetcode28题,求一个字符串是否和另一个字符串中的子串相匹配,如text = “hello”, pattern = “ll”,匹配的头坐标就是2.此题通过常规的遍历算法可以解决,算法复杂度就是O(M^N),M是text的字符串长度,N是pattern字符串的长度。通过KMP算法可以简化算法复杂度,达到O(M+N)的算法复杂度。KMP算法的核心就是寻找needle子串中是否存在相同的后缀与前缀并记录下来,记录的数组称为next数组,next[j]=k,表示pattern中
2020-12-04 14:34:38 122
原创 kubernetes调度器源码级别分析
Kubernetes Scheduler原理分析调度器的作用是将待调度的Pod按照特定的调度算法和调度策略绑定到集群中的某个合适的Node上,并将信息写入etcd中。目标节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定事件,获取对应的Pod清单,下载Image镜像。调度过程中涉及的三个对象:待调度Pod列表可用Node列表调度算法和调度策略默认调度的调度流程分成两步:4. 预选调度过程:遍历所有目标Node,筛选出符合要求的候选节
2020-12-04 09:18:44 300
原创 算法与数据结构(动态规划)
动态规划动态规划题目的难点在于如何思考出用动态规划求解,以及动态规划的状态转移方程。TIPS:当出现算法复杂度为指数增长时,我们就可以考虑是否存在动态规划的解法。动态规划题目类型分类:背包问题:0/1背包: lc416(简化为1维数组的时候为什么会从后往前遍历?)完全背包(无限背包)最长公共子序列(LCS)最长上升子序列(LIS)最长回文子序列最长递增子序列最长回文串...
2020-11-30 17:28:45 102
原创 算法与数据结构(链表)
链表题目一般的链表题目考察的是对链表类型数据结构的操作,对于链表来说常见的操作有:(1)链表题目经常会出现返回头指针,为了方便进行统一操作,经常会给输入的链表创建一个临时的头指针。例如将两个链表进行排序并返回头指针,可以写一下代码发现,如果不创建一个临时的头指针会多写一个判断来得到排序后的头指针。如果创建一个头指针其实就可以优化代码,少写一个判断来得到头节点的逻辑(2)链表常见的骚操作- 一个链表进行的操作:翻转、复制- 两个链表进行的操作:求两个链表的交点(通过骚操作“第一轮让两个到达末尾的节
2020-11-23 17:04:53 91
原创 CUDA 学习笔记
二维grid下,二维block的线程全局id获取线程分配如下所示:线程分配格式为:gridDim.x = 2gridDim.y = 2blockDim.x = 2blockDim.y = 2那么线程的global_id可以表示为:global_index = row_offset + block_offset + tidrow_offset = number of threads in a row * blockIdx.y= blockDim.x * blockDim.y * grid
2020-11-19 10:21:01 195 1
原创 深入理解C++ 11 笔记
此文档用于记录编写或者阅读C++代码中遇到的知识点。std::forwrad 与 std::move在了解forward与move语义之前,需要了解c++11中增加的一个新类型右值引用(T &&)。左值表示表达式结束之后依然存在的持久对象,右值指表达式结束时就不存在的临时对象。可以通过移动构造函数避免拷贝构造函数中的深拷贝,提高性能。#include<iostream>using namespace std;class A{public: A():m_
2020-11-17 14:24:32 115
原创 李宏毅语音识别课程摘要
语音识别Overview语音识别输出的数据类型(Token)分类Phoneme:发音的基本单位(类似于音标)需要一个lexicon记录word与phonemes的对应关系:Grapheme:书写的基本单位中文:一个字英文:26个英文单词无需lexicon的映射关系word:词不同语言的词汇都非常的多-morpheme:有意义的基本单位(长度在word和grapheme之间)例如unbreakable的morepheme可以拆分成:“un” “break” “abl
2020-11-05 17:08:26 686
原创 cuda 优化实例--计算平方和
平方和程序的渐进优化当线程访问global memory没有顺序访问线程顺序访问global memory在1的基础之上增加并行计算规模,也就是使用多个block如何选择最优的的线程配置,可能影响线程配置的因素有一下几个:为了高效地使用寄存器,每个sm上至少要有192个激活的线程为了将bank冲突将到最低,应尽量使每个block含有的线程数是64的倍数当某个block中的线程被同步时候,为了避免对应的sm出现闲置,通常让block的数量是sm的2倍以上,以便使得处于不同状态的(闲置或者不闲
2020-11-01 20:22:21 510
原创 CUDA精讲(4)-- 性能优化
通信 vs 计算Kepler架构来说,其峰值处理性能达到了3900Gflops,而其带宽只有250GB/s,约等于63Gflops。计算/通信约等于60。也就是说我们编写的程序达到的计算/通信极限是60左右,一般来说很难达到这个数值,但是我们需要朝着这个目标而努力。计算/通信比还有一个叫法:Compute to Global Memory Access(CGMA)ratio。具体来说,执行一个计算指令只需要1~4个时钟周期,而从global memory中访问一个数据需要400 ~ 800个时钟周期,
2020-10-15 16:27:33 899 2
原创 CUDA精讲(3)-- GPU体系结构之内存层次结构
内存层次结构内存层次结构是GPU当中非常重要的一部分,对于性能的优化至关重要,内存的层次结构可以分成一下三个部分来讲:Register & Local memoryShared memoryGlobal & constant memoryGPU内存层次概览每个thread的local variable对应:register、local memory每个block中的shared variable对应一个shared memory每个grid中的globel var
2020-10-10 10:59:40 2294
原创 CUDA精讲(2)-- GPU体系结构之线程执行
GPU体系结构本讲是CUDA精讲的第二部分,在CUDA精讲(1)中主要列出了CUDA编程的一些基本概念。为了进一步地深入CUDA的系统优化我们需要了解GPU的硬件体体系结构。大部分的处理器体系结构都可以分成计算、存储、控制三部分。GPU中主要强调计算(Thread exection)与存储(Memory hierarchy)两部分,下面就以下两部分进行展开。线程执行(Thread execution)内存层次结构(Memory hierarchy)Thread executionCUDA线程
2020-10-10 10:05:36 419
原创 CUDA精讲(1)-- cuda基础
背景随着深度学习的发展,并行计算的需求也越来越多,不论是算法工程师还是搞性能优化的,知道点cuda编程也是当前的必备技能之一。但是目前关于gpu资源很杂,重点不突出,我们需要在极短的时间内get到cuda的精华,本系列就由此而诞生。文章框架cuda精讲系列文章主要由三部分构成:cuda基础GPU架构cuda编程优化每一部分都是通过知识点的方式将重点提炼出来,方便快速查看。cuda基础cuda的基本概念host: CPUdevice: gpu从软件层面讲:(1)kernel:就
2020-10-09 17:21:34 1410 1
原创 利用pytorch进行图像识别实战
总体流程数据预处理部分:数据增强:torchvision中transforms模块自带功能,当原始数据不够多的时候通过Data Augmentation(数据增强)使得图片的数量变多。CV中常用数据增强的方法有:对图片进行翻转、放大、缩小数据预处理DataLoader模块直接读取batch数据网络模块设置:加载预训练模型,torchvision中有很多经典网络架构,调用起来十分方便,并且可以用人家训练好的权重参数来继续训练,也就是所谓的迁移学习需要注意的是别人训练好的任务跟我们的
2020-09-30 14:16:58 2611 1
原创 从零开始语音识别(5)--- 端到端的语音识别系统
为什么需要端到端的系统传统语音识别系统非常复杂,需要分别训练声学模型、语言模型、发音模型需要领域特殊的专业知识通过端到端的模型可以直接将输入的声学特征转变为文本端到端语音识别系统介绍Seq2Seq此模型长用于机器翻译、语音识别。其优点是输入输出不需要等长,而且两者长度不固定。此模型包含两个RNN结构,分别用于编码与解码。Decoder网络直到解码的序列是END才停止,因此可以实现变长的输出。Encoder将输入进行编码,将整个输入的隐状态输入给Decoder,可以实现输入的变长。
2020-09-18 15:30:14 2429
原创 从零开始语音识别(4)--- HMM算法详解
GMM只能针对单个样本(变量)进行建模,当把随机变量延伸到随机序列的时候,就需要通过HMM模型进行估计。HMM基本组成:HMM由初始概率分布(π\piπ)、状态转移概率分布(A)、观测概率分布决定(B), A,B,π\piπ是HMM的三要素当HMM的观测概率分布是由混合告诉模型GMM表示时,称之为GMM-HMM模型。HMM的三个基本问题:概率计算问题:直接计算法前向算法:后向算法:预测算法:Viterbi算法:3. 学习算法:Viterbi学习算法:Baum-We
2020-09-16 17:28:36 712
原创 从零开始语音识别(2)--- 语音信号处理
语音信号特征提取流程预加重:preemphasis反应到代码其实就是1行:np.append(signal[0], signal[1:] - coeff * signal[:-1])加窗分帧为什么要加上帧移?加窗的代价是一帧信号两端的部分被削弱了,没有像中央的部分那样得到重视。弥补的办法是,帧不要背靠背地截取,而是相互重叠一部分。相邻两帧的起始位置的时间差叫做帧移,常见的取法是取为帧长的一半,或者固定取为 10 毫秒def enframe(signal, frame_len.
2020-09-15 17:38:34 643
原创 从零开始语音识别算法--(1)基本概念
学习目标希望从语音识别开始深入,最后可以开发一个个性化语音合成的系统。这样就可以随时随地可以听你想听到的人说话啦。语音识别的总体思路语音基本单位:帧(Frame)HMM模型:初始状态概率(P(w1))和状态转移概率(P(w2 |w1)、P(w2 |w2))可以用常规的统计方法从样本中计算出来,主要的难点在于发射概率(P(x1 |w1)、P(x2 |w2)、P(x3 |w2))的计算,所以声学模型问题进一步细化到发射概率(Emission Probability) 的学习上,可以通过生成式模型(
2020-09-15 14:27:39 933
原创 gpushare-scheduler-extender源码解析
阿里云在k8s中实现了在容器间对GPU的资源共享,具体实现为:aliyun/gpushare-scheduler-extenderaliyun/gpushare-device-pluginscheduler-extender与default scheduler的关联:在default scheduler的默认启动参数中添加参数--configextender-config.yaml中为extender-polilcy.json中包含了定义的extender详细拓展接口,扩产verb动词.
2020-08-20 15:58:14 1041
原创 面经之--老铁厂资源调度架构工程师
问的主要是k8s相关的东西,问到了源码级别的相关的设计,最后问了下面试官也是开源社区的推动者,入职后也是参与k8s内核源码的开发。CRD的原理,问得非常细致,我说分成两个部分一个是client一个是controller,后面试官问api资源从哪里取,队列还是缓存?pvc的原理,我说分sc、pv、pvc以及之间的联系。后问是否了解localpvcgolang中 channel的实现原理k8s中阅读过哪些部分的源码,之前看过一点scheduer部分的一些调度算法源码,大概说了下使用greedy进行调度
2020-08-13 19:42:08 175
原创 没有人比我更懂集群调度器---调度算法对比
集群调度器中的调度算法贪心调度:分成两个步骤,(1)过滤:根据用户的需求过滤掉一部分的节点。(2)优选:对过滤后的节点进行打分,选择分数最大的节点。这种调度方式对于一个作业来说是最优解,但是对于对于整体来说一般不是最优解。典型使用这种算法的调度有:k8s、openstack 中的nova调度器公平性调度:min-max fair:考虑用户集合1, …, n分别有资源需求x1, x2, …, xn.不失一般性,令资源需求满足x1 <= x2 <= … <= xn.令服务器具有能力
2020-08-13 00:14:34 354
原创 没有人比我更懂集群调度器---之流行集群调度器综述
集群调度器的演进Firmament.io这片paper详细总结了目前调度的几大分类:a. 集中式调度器:代表k8s、Hadoop 、HPC 调度器。优势:调度器可以感知全局信息,因此可以基于此开发不同的调度算法来避免因为作业竞争而产生作业干扰。因为可以获取集群全局信息因此可以设计优先级抢占算法。劣势:1. 针对不同类型的作业都采用了同一种调度算法; 2.调度器对作业处理的顺序是一个问题,需要一个良好的作业优先级定义,否则可能产生队头阻塞与作业挤压的问题。b. 两级调度器:代表mesos。优
2020-08-11 00:10:40 764
原创 强化学习从入门到放弃(二)Q-learning 与 Sarsa
Q-Learning 与 Sarsaq-learning 与sarsa都是model free情况下通过 TD求解的Bellman equation的方法。他们的区别是q-learning是off-policy的,sarsa是on-policy的。公式对比Sarsa:Q-learning:二者的区别:网上都在说sarsa是一个保守的算法,而q-learning是一个更价激进的算法,这是为什么呢?Sarsa是一个说到做到的算法,Q(s,a)Q(s,a)Q(s,a)的估计值与下一个状态S‘
2020-08-06 23:29:28 448
原创 强化学习从入门到放弃(一)基本数学模型MDP
强化学习最本质的数学模型,MDP强化学习的本质其实就是一个马尔可夫决策过程(MDP),在一个,MDP中最关键的一个公式就是bellman equation:下面说的是在一个没有action的MRP过程中,一个状态的价值v(s)v(s)v(s)与当前状态的奖励R(s)R(s)R(s) 和此状态的转移状态V(s′)V(s')V(s′)有关。对于Bellman equation有三种求解方式:DP,需要知道状态之间的转移概率Monte-Carlo,蒙特卡洛其实就是不断采样尝试,直到收敛Tempo
2020-08-06 22:48:26 1886
原创 强化学习---Q-learning的理解
强化学习的数学模型强化学习本质上是一个马尔可夫决策过程(MVP)。在一个初始状态S下通过一系列动作集合 A下的决策,找到决策过程中的最优解。RL训练的过程就是不断的进行尝试并记录之前的决策过程,在一此决策的过程中较大概率的选择记录表中分数较大的动作,这个就是Q-learning算法,最终训练出来的表就是Q值表。举个栗子走迷宫:任务描述:红块从左上角开始走到黄圈代表天堂即为成功,黑块代表地狱走进去就是失败。问题分析:如果不从增强学习的角度,这道题其实直接用dfs或者bfs就可以求解。所以用R
2020-07-30 23:49:22 667
原创 阿里云原生编程挑战赛--实现一个 Serverless 计算服务调度系统
题目简介一个简化的Faas系统分为APIServer,Scheduler,ResourceManager,NodeService(kubelet),ContainerService(container) 5个组件,系统组建可以类比与k8s。APIServer:负责函数库的查询与作业提交ListFunctions:返回所有可调用Function信息InvokeFunction(Function,Event):执行某个Function,传入Event。Scheduler:管理容器的组件,APIS
2020-07-22 00:11:31 356 1
原创 经典的资源调度算法
经典的allocation algorithm原文链接:原英文链接First Fit:寻找第一个合适的资源空间优势:因为只需要找到第一个符合条件的部分,所以该算法很快劣势:会出现占用的空间内剩余的资源比较少,产生资源碎片而导致资源浪费的情况Best Fit:寻找满足资源限制并且分配资源后剩余资源空间最少,遍历整个搜索空间去寻找最接近资源需求的空间优势:资源利用率会比ff要好很多劣势:比ff要更慢一些,并且会剩余很多难以利用的空闲小资源Worst Fit:与best Fit相反,分配剩余资源
2020-07-14 15:54:51 3027
原创 阿里巴巴2020年云原生编程赛赛道二(一)题目解读
阿里巴巴云原生编程赛2—实现规模化容器静态布局和动态迁移目前存在问题业界多数调度器均通过通过队列使用不同打分策略以one-by-one的方式调度容器,设计上并不感知后续待调度容器信息,串行扩容顺序会左右调度结果,进而极大地可能会导致资源的浪费。因此需要感知集群状态,并且进行容器迁移以减少资源的浪费与作业队列等待赛题描述应用建模应用信息实际以 “应用名、应用分组” 两个维度的形式呈现,同一个应用名下会有多个应用分组(appName:group=1:N)集团内部应用与应用、分组与分组之间有各种
2020-07-01 18:09:10 388
原创 2020-05-15-用于深度学习训练的分布式多租户GPU集群分析
Analysis of Large-Scale Multi-Tenant GPU Clusters for DNN Training Workloads作者提出分布式机器学习系统中出现的三个问题:作业调度GPU利用率训练中会产生的错误作业调度由于分布式机器学习中要求资源限制而使用gang调度算法,因此会产生资源碎片导致利用率不高。由于需要同步参数因此分布式作业locality非常重要,但也由于locality的调度限制也产生了排队延时。作者研究表明,通过放宽locality的限制可以减少
2020-07-01 14:29:02 847
原创 Horovod源码剖析(一)
Horovod源码剖析:核心模块 – operationshorovod/common/operations.h首先了解一下mpi常见的通信操作MPI-Scatter:scatter与broadcast类似都是一对多的通信,将一段array 的不同部分发送给所有的进程MPI-Boardcast:与scatter进行区分,broadcast是将0号进程将相同的信息发送给所有的进程;MPI-Gather:MPI_Gather和scatter刚好相反,他的作用是从所有的进程中将每个进程
2020-07-01 14:23:21 1007
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人