Blog Posts

Allo:用软件方法论设计硬件加速器

Published:

从我写完上一篇 blog《剖析 FPGA 加速大模型推理的潜力》之后已经过了差不多半年,这半年我们看到了很多取代 Transformer 的尝试,也看到了各类 LLM 加速器层出不穷。我们在论文中所提倡的 model-specific spatial architecture 也确实有公司进行实操了,Groq 就用了他们几百张加速卡,做了一个纯 dataflow 的 in-SRAM 加速方案。虽然成本令人望而却步,但他们超高的性能也从侧面反映了最大程度减少内存访问的优势。

除了可行性的问题,我们收到的最多的就是关于开发成本的评论,FPGA / ASIC 固然好,但是开发周期非常长,所以哪怕我们论证了这种 model-specific acceleration 的可行性,如果不能方便快速地将新的模型综合成高效的硬件加速器,那也相当于没用。这个问题本质上是怎么提升程序员的生产力(productivity),这也是我 PhD 期间一直在探索的主线项目——希望重新塑造硬件的编程/设计方式,来让更多的人受益于最新的硬件。而 Allo 正是我们在加速器设计上做了很多年的工作的一个里程碑,也是我们对未来编程模型的一个展望。

ASPLOS’24 Attendence Summary

Published:

This year ASPLOS took place in San Diego, California. I am fortunate to have a paper got accepted, which provided me the opportunity to attend and present my work at the conference. This blog post primarily offers a summary of the conference papers, focusing on topics related to my research, including machine learning systems, compilers, accelerators, and hardware synthesis, which appears to have ~50% of the total number of papers presented.

剖析 FPGA 加速大模型推理的潜力

Published:

  • TLDR: 用 FPGA 加速 LLM 推理在特定场景下能够达到比 NVIDIA A100 GPU 更高的性能和更低的能耗,但并非所有场景都适合用 FPGA。
  • 论文链接:https://arxiv.org/abs/2312.15159

这一年生成式大语言模型(large language models,LLMs)的爆火直接促进了 NVIDIA 卖卡的进程,股价直接翻了几番,现在高价求卡都还一卡难求。NVIDIA 的 GPU 虽好,它高额的成本和产生的电费让很多人望而却步。为了实现更加高效的 LLM 部署,最近几个月来互联网厂商一方面继续买 N 卡,另外一方面也在寻求替代品。所有人都知道需要寻找一种更加高效且低功耗的加速器,但究竟什么硬件才能实现这个目的。一些厂商直接开始了造芯进程(Google 的 TPU,Amazon 的 Inferentia,和 Microsoft 刚出的 Maia 等等),但是造芯的周期太长,一旦流片也很难跟上瞬息万变的模型发展(Maia 尴尬的内存带宽就是个例子)。而在通用处理器 CPU/GPU 和专用加速器 ASIC 中间其实还有一种硬件,既能做到一定的可编程性,又能达到比通用处理器更高的性能,这就是可编程门阵列 FPGA(Field-Programmable Gate Array)。目前最大的 FPGA 厂商是 Xilinx(已经被 AMD 收购),其芯片也陆续被集成进现在高端的 SoC 里面。我们最近的工作正是要探讨利用可重构硬件 FPGA 到底能不能在 LLM 这波浪潮下占据有利地位,以及 FPGA 在大语言模型推理上究竟能够释放多大的潜力。

PhD第二年 - 自由而热烈

Published:

在Austin开会做完presentation,线下跟人聊还是没能完全改口说自己是second-year PhD的说法。进入第三年就有种旅程已经过半,很快要毕业的感觉。PhD第二年过得很快却又经历了太多事,在西海岸呆了半年,又回来东海岸过了很intense的一个学期以及疯狂的暑假。大概是走火入魔了,PhD读到现在反倒很快乐。 一方面是科研稍有起色,能够持续做自己喜欢的research本身就是件快乐的事;另外一方面则是有很多很棒能够一起喝酒打牌玩耍的朋友,在村里在纽约在波士顿都能吃上热腾腾的饭菜,去到哪都感觉跟回家一样,所以一直都很幸福。

NSDI’23 Attendence Summary

Published:

NSDI’23, a conference focused on networked systems design and implementation, was held in late April in Boston, MA. Thanks to my paper on a GNN system that I worked on during my undergraduate internship at ByteDance, I was fortunate enough to receive the USENIX travel grant to attend the conference. While I did not have the opportunity to review all of the papers beforehand, I will provide summaries of the sessions that I attended in this post.

ASPLOS’23 Virtual Attendence Summary

Published:

This year ASPLOS was held in Vancouver, Canada. Several of my friends attended the conference in-person and gave excellent talks. As many papers are very interesting, I attended the conference virtually. This blog post primarily provides a summary of papers presented at the conference that are related to machine learning systems, which constituted around 50% of the total number of papers presented.

Tips for CS PhD Application

Published:

今年非常幸运能够帮系里审核PhD申请材料,从两年前懵懵懂懂申请到现在进committee,完整体验了整个流程,因此本文会记录下一些审材料时reviewer看中的点以供参考。(本文属于挖坑贴,会陆续补充一些细节)

PhD第一年 - 启程新世界

Published:

一年前从深圳蛇口过关穿过空无一人的走廊,坐轮渡去香港再飞纽约,想着此去经年,大概接下来五六年都要在陌生的国度再也回不去,面对着不确定的未来,心中满是焦虑与不安;一年后坐在从东海岸飞往西海岸的飞机上,虽然同样要开启截然不同的新生活,但似乎不再那么迷茫,远远总能看到指引的灯光知道如何前行。

CCC2021

Published:

临近毕业没有事情干,就和同学参加了CCF体系结构专委举办的第一届定制算法挑战赛(Customized Computing Challenge, CCC’2021)。比赛形式是用Xilinx Vitis HLS(工具链组委会已经部署在云端)实现并优化一些算法的硬件电路,只需通过cosim模拟得到硬件的frequency和latency得到最终的性能指标,而无需实际上板,因此整个开发流程便捷了很多,大幅度降低了编程部署门槛。

初赛分为3个级别的题目,初级题包括经典的Sobel算子FFT,中级题为排序SVM、加密算法ECDSA,高级题为图算法(图直径图染色最小生成树)。其中,初级题2题必做,中级题3选2,高级题3选1,最后对三个级别的题目乘以难度系数后加权求和排名。

之前做研究的时候只是简单运用了HLS进行一些优化,一直没有深度应用过,这次比赛总算自己摸索出了HLS常用的优化方法以及面临的问题,虽然只差一点进入决赛(事实证明参加的队伍都非常强),但在这个过程中收获的技巧倒是大有裨益,因此本文还是对初赛的题目进行回顾,并给出我们的优化方法。

(本文持续更新中)

HLS Examples

Published:

本文记录HLS的一些优化实例,摘自PP4FPGA一书。

2021 Fall CS PhD 申请回顾

Published:

本文记录我2020年申请美国2021 Fall CS PhD的完整历程,希望能贡献一个样本点,也能为后来者提供一些指引吧。(本文部分内容摘自《中大计院飞跃手册》,之后再想到什么会不定期补充)

Pynq & Zynq SoC Tutorial

Published:

由于毕业论文打算进行FPGA加速器的设计,希望能够打通计算机系统栈从上到下的各个层次,因此本文将记录Ultra96-V2这款SoC的使用。

VizTracer

Published:

VizTracer是个非常简便快捷的Python profiler,无需修改源代码即可对每个函数进行测时,并将结果以火焰图的形式展示。可以支持大型项目(如深度学习训练),同时也支持多线程和多进程的性能剖析。

Matplotlib Snippets

Published:

本文记录Matplotlib几种论文中常见类型图表的作图方式。

DGL分布式训练

Published:

由于目前图神经网络框架DGL的分布式模块仍在建设中,文档非常不齐全,故本文主要记录分布式训练GNN的整个流程。

Property buffers for concurrent graph jobs

Published:

刚好投完SC,还是记录下这次想法的由来,也算是占坑了。简而言之,我们设计了一个并发图系统Krill,以支持在同一shared graph上面跑多个图算法/任务(job)。一开始只做了kernel fusion的runtime,而这一次则进一步从compiler层面实现了property fusion,从而最大程度提升访存局部性,大幅提升了并发图处理的性能。

Intel ICPC Compiler

Published:

Intel ICPC是Intel自家的编译器,对自家的CPU架构(特别是服务器端CPU)有着特殊的优化,而且内置TBB和Cilk Plus等线程库,属于高性能计算必备。

注:2020年底已经改名为Intel oneAPI DPC++/C++ Compiler,可通过Linux的apt直接安装,安装指令参见这个页面(安装更为快捷方便),调用变为dpcpp,其他使用基本没有变化。

Bash指令速查

Published:

本文总结Linux bash的常见用法,作为Cheat sheet使用。

PageRank Delta

Published:

本文记录PageRank Delta的推导过程及在图系统中的实现。

TVM Overview

Published:

时隔一年再回来看TVM,诸多感受。

TVM - 代码生成流程

Published:

本文主要介绍TVM的代码生成流程,即调用relay.buildtvm.build之后发生了什么,将深入到TVM的源代码进行剖析。(这里采用的依然是TVM v0.6)

TVM - Relay IR计算图可视化

Published:

本文主要介绍如何将Relay IR的计算图(computational graph)/数据流图(dataflow graph)进行可视化输出。

静态程序分析 (SPA)

Published:

南京大学的李樾谭添老师在2020年春季开设了《软件分析》课程,讲授静态程序分析(static program analysis, SPA)的相关内容。由于一直很想系统学习编译器优化及编程语言的知识,但无奈一直没有找到好的资料,国内开设相关课程的学校和老师可以说几乎没有。刚好看到谭添老师在知乎上的宣传,又恰逢疫情期间,就跟着B站的录播视频一起学了。

本文算是课程的学习笔记吧,会随着课程进度不断更新,完整的课程课件需要等两位老师放出来(已经放出来了,参见课程网站)。由于一年前我已经跟着UFMG的DCC 888学过一段静态程序分析,所以其中一些细节可能我理解了就不会再附在这。从短短几节课的感受来说,南大的课程更加适合新手入门,以Java为基础,以Soot作为静态分析工具,老师会事无巨细地讲解分析算法步骤。而UFMG的课程以C/C++为基础,以LLVM作为分析器,看上去他们的课时更加充裕,从理论到工具的使用也都有详细的讲解。

TVM - GEMM优化

Published:

本文记录如何使用TVM v0.6在CPU上优化GEMM,节选自TVM官方教程。类似地,可参考Vivado HLS优化GEMM的方法。其中涉及到局部性(locality)的问题会详细进行分析。

TVM - Tensor Expression

Published:

本文以向量加法为例,记录TVM最最基本的Tensor Expression的使用,以及简单的编译运行流程。

再谈DSL

Published:

看看这几年领域特定编程语言(Domain Specific Language, DSL)的发展,会发现算法和调度的解耦越来越明显,同时编译和综合的边界越来越模糊。

TVM - 安装

Published:

本文记录TVM的安装方式,主要验证官方教程中从源码安装是否对WSL可行,同时在VS Code上配置相应的开发环境。

Vivado HLS in a Nutshell

Published:

本文将详细介绍Vivado HLS的配置、入门及优化方法,包括各类pragma及库函数,同时给出大量参考资料供查阅。

图表示学习(4)- 图神经网络加速器

Published:

这是图表示学习(representation learning)的第四部分——图神经网络加速器,主要涉及HyGCN [HPCA’20]和GraphACT [FPGA’20]两篇文章。

目前(截止至2020年3月10日),图神经网络加速器的文章共3篇,除了上述两篇还有DAC’20一篇尚未放出全文。

软件2.0时代与TVM

Published:

最近重读了一些文章,感觉对深度学习又有了一些更加深层次的理解。

图表示学习(3)- 图神经网络系统

Published:

这是图表示学习(representation learning)的第三部分——图神经网络系统,主要涉及2019-2020年顶会上面的工作。(更新于2020年12月

图表示学习(2)- 图神经网络

Published:

这是图表示学习(representation learning)的第二部分——图神经网络(graph neural network, gnn),主要涉及GCN [ICLR’17]、GraphSAGE [NeurIPS’17]、GAT [ICLR’18]和C&S [Arxiv:2010.13993]三篇论文。

图表示学习(1)- 图嵌入

Published:

由于今年要着手一些图结合AI的工作,因此在此对一些经典文献做一些总结。

这是图表示学习(representation learning)的第一部分——图嵌入(graph embedding),主要涉及DeepWalk [KDD’14]、LINE [WWW’15]、node2vec [KDD’16]、KnightKing [SOSP’19]、GraphZoom [ICLR’20]五篇论文。

程序综合与编译

Published:

程序综合(synthesis)和程序编译(compilation)常常会被混淆。我们大多数人熟知的是编译,比如将C++代码编译为x86汇编;而在FPGA中我们更多会采用综合一词,比如高层次综合、逻辑综合、物理综合等等。两者工作似乎都是将一种语言翻译为另一种语言,但事实上仔细分析一下还是有很多区别。

CCF-ADL-105《面向大数据的系统软件与系统结构》

Published:

2019年9月7日至9日,中国计算机学会(CCF)于北京中科院计算所开展了第105次学科前沿讲习班(ADL),主题为《面向大数据的系统软件与系统结构》。这次讲习班请到了国内做系统做得最为出色的那些学者过来做报告,我也有幸到现场去学习,本文为简要的会议记录。

请到的几位老师以及他们的报告题目如下:

讲演者 单位 题目
周礼栋 微软亚洲研究院 《大数据系统的演化:理论、实践和展望》
谭焜 华为中央研究院 《从虚拟化到“在网计算”:智能网卡和在数据中心网络中的应用》
陈海波 上海交通大学 《面向新存储介质的文件系统设计、实现与形式化验证》
陈云霁 中科院计算所/寒武纪 《智能计算系统课程》
郭振宇 阿里巴巴/蚂蚁金服 《大数据系统实践:从MapReduce到融合计算》
舒继武 清华大学 《大数据场景下的持久性内存存储系统构建探讨》
包云岗 中科院计算所 《面向下一代计算的开源芯片与敏捷开发实践》

机器学习与组合优化

Published:

组合优化(Combinatorial Optimization, CO)从有限的可行解集中搜索出最优的解,是传统运筹学(Operations Research, OR)中一个重要的分支。 而机器学习(Machine Learning, ML)同样也是优化问题,故跟运筹学有着紧密的联系。

Pin动态指令分析工具

Published:

Pin是Intel公司开发的程序分析工具,类似于Valgrind

但是!看上去Pin的可定制化程度高得多,可以自己编写Tools作为分析工具,可以想象为Pin是一个更加底层的LLVM[CGO, 2004]。所以体系结构领域常用Pin来写cache或prefetcher的模拟器。

LegUp使用及源码分析

Published:

本文主要记录由加拿大多伦多大学开发的开源高层次综合工具LegUp HLS的编译、使用方法及源码分析。

配色与字体索引

Published:

因为在论文、报告中常常要自己画图,故本文记录常用的一些论文配色方案及字体名称。

Git操作指南

Published:

虽然Github Desktop用得很爽,但是偶尔也会有一些特殊的需求(比如回滚或是在Linux环境下操作),故还是在此记录一下。

分布式深度学习-基本概念

Published:

这篇文章在三年前就已经写过,但三年后深度学习的世界发生了翻天覆地的变化,越来越多大模型的出现使得分布式训练成为不可或缺的一部分。正好我现在也要进行相关的工作,因此还是重新整理更新一下内容,力求覆盖到领域的最新进展。本文将主要介绍三种基本的并行模式:数据并行、模型并行和流水线并行

Continuous Passing Style (CPS)

Published:

CPS是函数式编程中一个非常常用的概念,将其用在并行程序/硬件设计中可能会起到意想不到的效果。

性能分析器

Published:

上一篇文章讲述了内存、CPU实时监视器的使用,而本文则着重于更高层的性能分析器(profiler)。

C++模板元编程

Published:

最近才稍微了解现代C++中非常重要的技术,即模板元编程,本文作为记录。

C++面向对象编程

Published:

本文会记录以前学习面向对象编程(object-oriented programming, OOP)忽略的一些点。

C++泛型编程

Published:

这次做图系统进行系统层级代码的编写,才发现C++中的诸多问题,以前并未思考过,现在查阅了大量资料才大致了解应该怎么做,仅以本文作为记录。

C/C++计时

Published:

本文记录如何使用C/C++进行计时操作。

网络编程——套接字

Published:

本文主要记录Linux环境下的网络编程,即用套接字(socket)实现TCP/UDP。

gdb调试指南

Published:

本文主要记录如何在Linux环境下用gdb对C/C++程序进行调试。

C与汇编混编

Published:

本文主要讲讲如何在C语言中嵌入汇编语言。

RPC通信协议

Published:

TVM-VTA里采用了RPC进行FPGA的通信,当时不是很理解。 今天在在OS书上又重新看到了RPC这个概念,所以查了一下资料,特此记录。

C/C++多线程

Published:

本文主要介绍C/C++中多线程编程的方法。

C语言常用操作

Published:

由于本学期计算机网络和OS课都要大量使用到C语言编程,而当时入学时对C的了解并没有这么深刻,所以这个学期相当于重新学习,在此记录。

操作系统环境配置

Published:

这学期开设了操作系统课程,需要我们从裸机开始写OS,这篇文章将记录完整的配置过程。

AVX指令集

Published:

这里简要介绍AVX指令集的一些基本指令,可以通过调用C++的库函数实现SIMD。

原子操作

Published:

并行编程中为避免线程之间的访问冲突,往往需要添加来进行同步。

Skylake架构简析

Published:

因为实验室服务器的CPU是Intel Xeon Gold系列,所以这里简要介绍一下Intel的Skylake-SP架构。

Makefile编写规则

Published:

Makefile在Linux环境下非常有用,它规定了整个工程的编译规则,即哪些文件先编译、哪些文件后编译、相互之间依赖关系是什么,是编写大型工程必不可少的工具。 而了解了Makefile的规则,你会发现其实它能做的不仅仅是C/C++的编译,它更是提供了一个强大的批处理工具。 下面的叙述以GNU的make为主。

LLVM

Published:

Low-Level Virtual Machine (LLVM)是一个编译器设施,包含一系列可重用的库和良定义的接口。 它的核心采用C++进行编写,支持多种前端编程语言及多种后端硬件,第一版由UIUC于2003年发布,开源,目前由苹果维护。

LLVM对应的C/C++编译器即为clang,通常编译时间要比gcc和icc少很多。

CPU/内存监视器

Published:

因为最近要做实验实时监测CPU还有内存的性能,找了非常久才找到符合我要求的工具,特此记录。

Prolog入门

Published:

本文内容整理自剑桥大学2011-12年David Evans开设的Prolog课程讲义。

Prolog(Programming in Logic)就是暴力美学的代表,一阶逻辑暴搜解决所有问题。

静态程序分析

Published:

本课程采用巴西米纳斯联邦大学(Universidade Federal de Minas Gerais, UFMG)的Static Program Analysis - DCC888讲义。 至于为什么选择这么一所名不见经传的大学的课程,一部分原因纯属偶然搜到,其他原因则有

  • 非常清晰易懂,幻灯片上图文并茂,力求将概念解释清楚
  • 没有繁琐的全套编译器的介绍,而着重讲解中间优化器的部分
  • 基本的优化技术都有涉及,广度是足够的
  • llvm作为实验基石,同时也附带抽象代数函数式编程等内容,是一门理论与实践相结合又十分前沿的课程
  • 附带讲讲编译器的历史,同时都附有参考文献

黄金时代!

Published:

本文内容节选自2017年图灵奖得主John Hennesy (Stanford)和David Patterson (UCB)在体系结构顶会ISCA’18的lecture

A New Golden Age for Computer Architecture:
Domain-Specific Hardware/Software Co-Design,
Enhanced Security, Open Instruction Sets, and Agile Chip Development

高层次综合

Published:

高层次综合(High-Level Synthesis, HLS)目标是将高级编程语言(High-Level Languages, HLL)编写的程序转化为硬件描述语言(Hardware Description Language, HDL)的程序。

领域特定语言

Published:

下面的内容主要基于Kunle Olukotun在Stanford开设的课程CS 442: High Productivity and Performance with Domain Specific Languages in Scala, 2011, Online。 但这门课是研究性质的,即主要以Stanford Pervasive Parallelism Lab (PPL)组开发的Delite作为基石讲解。 因而在这里我只会将部分通用的重要的章节抽取出来。

缘生Halide

Published:

这篇文章主要谈谈由Halide这门图像处理领域专用语言(Domain Specific Language, DSL)中衍生出来的故事。 关于DSL的内容则请见领域特定语言

高级编程语言vs硬件描述语言

Published:

很多老师都将硬件描述语言当成一门编程语言来教,我本人也一直认为硬件描述语言与传统的编程语言类似,只不过添加了时序特征。 但其实这都是非常不正确的,硬件描述语言并不同于传统的编程语言,它更多是所见即所得–用于描述硬件功能,而不是告知程序如何运行…

FPGA结构、编译与应用

Published:

What is FPGA? Why FPGA?

可编程门阵列(Field-Programmable Gate Array, FPGA)是一种并行非冯架构硬件,其最大的亮点就在于可编程/可重构(reconfigurable)。

由于FPGA的每个逻辑单元在重编程/烧写时已经确定,故它不需要指令,也不需共享内存。它的逻辑块、交互连接(interconnects)、IO接口都是可编程的。

FPGA的优势在于

  • 比CPU快
  • 比GPU省功耗
  • 比ASIC便宜流片周期短

Tensor Virtual Machine (TVM)

Published:

TVM与LLVM对比

  • TVM (Tensor Virtual Machine, 2018):针对不同框架(前端),面向不同硬件(后端)
  • LLVM (Low-Level Virtual Machine, 2003):针对不同语言(前端),面向不同硬件(后端),最核心部分为LLVM IR,提供模块化可重用的编译器和工具链技术,重点在于优化器
    • Tapir 往LLVM添加了并行元素

Tools Setup!

Published:

工具是重要的!这点其实很多老师都不会讲述,在我院开设的大量本科基础课上,老师也不会专门讲述现代化工具的使用。 然而好用的用得顺手的工具可以使工作效率大大提升,不好用的工具虽然也可以用,但是会增加很多不必要的时间。

最简单的例子是很多非计院的同学学了一整个学期代码(C++/Java),都还在非常古老的IDE上写程序(e.g. Dev)。 这当然可以写,但如果有更强大的工具可以让你事半功倍,何乐而不为呢?

这篇文章列举/总结我目前所使用的一些工具作为参考,这些工具基本都使用了非常长的时间,亲测比较好用。

(基于这点motivation,所以我在2019-2020年度开了门ToolsSeminar的研讨课,详细内容可见这里。)

深度学习框架与图分析框架的异同

Published:

什么是框架(Framework)?

  • 对某个特定领域各种算法进行抽象
  • 抽取其中大量重复利用的单元成为算子
  • 现有编程语言(Python/C++)基础上提供API接口
  • 注意尚未达到编程语言的级别,如果连语法(syntax)也一并规定,那就变成领域特定语言(Domain Specific Language, DSL)

简而言之,框架是大量可重用的基础设施/库的集合,而语言需添加语法元素

Why blog?

Published:

标题的答案很简单,一个学CS的没有搭过自己的博客怎么行呢(

事实上一年前就有这个想法,跟同学折腾了很久,又买域名又买服务器,用Wordpress搭建了一个博客,但不久就不了了之。 原因是操作太为繁琐,以致于根本体会不到写文的快感。

其实我想要的博客功能很简单,就是写写文,而不要那么多花俏的东西(Wordpress很大程度上功能太多,想要搭建什么都可以,但直接后果是写博客反而不方便)。

我心目中一个好的博客应该是一个简洁而不简陋,记录和阅读的良好场所