supercool

Transformer Hardware Friendly Accelerator_2

    人工智能杂谈

深度学习

张量

概念

张量(tensor)是在深度学习中广泛使用的一种多维数组,可以存储和处理大量的数据。它可以是任意维度的数组,可以包含数值、字符串等多种类型的数据。在PyTorch、TensorFlow等深度学习框架中,张量是构建模型、进行计算和优化的基本数据结构。

量化

概念

量化是指將一個连续数值的信号转换成为一個离散的数字信号。在深度学习中,量化的主要目的是减小模型的内存占用和计算量,并提高模型的推理速度。具体而言,通过将神经网络中的参数和激活值从32位浮点数(FP32)转换成8位整数(INT8)等低精度表示形式,可以在不显著降低模型性能的情况下,大大减小模型的体积和计算量。
量化的核心思想是减少数字的表示范围,因为低精度的表示方式可以大大降低存储空间和计算复杂度。在量化中,通常会使用一些技术来最小化信息损失,例如对称量化和非对称量化等。对称量化通常是将数字范围划分为一些等间隔的区间,每个区间用一个整数表示,而非对称量化则是将数字范围划分为两个不同的区间,一个表示正数,一个表示负数,并分别用整数表示。
虽然量化可以提高模型的推理效率,但是在进行量化时,需要权衡精度和效率之间的平衡。因此,通常需要进行一定的实验和调整来找到最优的量化方式。

量化因子

量化因子是指用来将浮点数值转换为固定位宽整数表示的比例因子,它是在量化过程中使用的重要参数,量化因子的计算是基于量化后的张量计算的。
具体而言,tensor_quant_scale函数首先对张量进行范围量化,以确定量化后数据的上下限。然后计算量化因子,使量化后的数据最大值能够被固定为量化位宽的上限,从而最小化量化误差
量化因子的计算公式为:scale = (max_val - min_val) / (2^(bits) - 1),其中max_val和min_val分别是量化后张量的最大值和最小值。这样,我们可以使用scale将浮点数值量化为固定位宽整数表示。在后续推理过程中,我们将使用相同的量化因子对张量进行反量化操作,以恢复其原始浮点表示

计量存储容量

“bit” 是计算机科学中最小的信息单位,它代表着二进制的数据位,是二进制数字 0 或 1 的缩写,其中 0 表示低电压或关闭状态,而 1 表示高电压或打开状态。
位(bit)、千位(Kbit,Kb,kilobit)、兆位(Mbit,Mb,megabyte)、千兆字节(Gbit,Gb,gigabit)用于表示不同大小数据传输速度,转换关系如下:

$$1Gbit = 2^{10}Mbit = 2^{20}Kbit =2^{30}bit$$

网络带宽通常用比特每秒(bps)或兆比特每秒(Mbps)表示
多个比特可以组合成更大的单位,如字节(byte)、千字节(KB,kilobyte)、兆字节(MB,megabyte)、千兆字节(GB,gigabyte)等,用于表示不同大小的存储容量,转换关系如下。

$$8bit=1byte$$
$$1GB = 2^{10}MB = 2^{20}KB = 2^{30}byte = 8*2^{30}bit$$

硬盘容量通常用千兆字节(GB)或千亿字节(TB)表示
例如,当提到4Gbit的存储器时,表示该存储器的总容量为4千兆位。同样地,当谈论网络连接速度时,4Gbit/s表示每秒传输4千兆位的数据量。
常见数据类型和位数

  • 单精度浮点数(float):32 位 | 4字节
  • 双精度浮点数(double):64 位 | 8 字节
  • 短整型(short int):通常为 16 位 | 2字节
  • 整型(int):通常为 32 位 | 4字节
  • 长整型(long int):通常为 32 或 64 位 | 4字节 或 8字节
  • 长长整型(long long int):通常为 64 位 | 8字节
  • 字符型(char):通常为 8 位 | 1字节
  • 布尔型(bool):通常为 1 位
  • 无类型指针(void pointer):通常为 32 或 64 位,取决于平台

进制

  • 二进制:Binary
  • 八进制:Octal
  • 十进制:Decimal
  • 十六进制:Hexadecimal

FPGA

HLS(high level synthesis)高层次综合

HDL(hardware description language)硬件描述语言

又名RTL(register transfer language)寄存器传输语言,用于描述数字电路的功能和行为的语言,可以在寄存器传输级,行为级,逻辑门级等描述电路。

  • VHDL
  • Verilog
    可综合 Synthesizable:可以生成硬件电路
    1
    2
    3
    for(int =0;i<8;i++)
    begin ...
    end
    1
    2
    if(en) b>a;
    else b<a;
    1
    2
    3
    case(sel)
    ...
    emdcase
    不可综合 Non-Synthesizable:不可以生成硬件电路
  • System Verilog
    加入了自定义类型,结构体联合体,接口等
    仿真约束:随机约束,UVM
    简化verilog中的语法表达,logic统一表达wire,reg

RTL设计

  • 组合电路
  • 时序电路
  • 状态机

RTL验证

仿真工具

modelsim

FPGA结构

查找表,逻辑单元,逻辑快,DSP,存储器

FPGA开发流程

开发流程

  • RTL设计
  • 仿真验证
  • 逻辑综合
  • 布局布线
  • 时序收敛
  • 下载与硬件调试

开发工具

vivado

  • 熟悉开发流程
  • 熟悉常用IP配置和调用
  • 熟悉时序分析的方法

#LINUX

unix和linux

Unix 和 Linux 之间存在着密切的关系。Linux 是一种基于 Unix 设计原理和思想的开源操作系统。简单来说,Linux 可以看作是在 Unix 概念和设计的基础上进行开发和扩展的。

Unix 是在 1970 年代早期由贝尔实验室开发的一种多用户、多任务操作系统。它具有强大的命令行界面和丰富的工具集,被广泛用于大型计算机和服务器领域。由于 Unix 的优秀设计和灵活性,它逐渐成为了许多操作系统的基础,并产生了多个变种和衍生版本。

Linux 则是由芬兰的林纳斯·托瓦兹(Linus Torvalds)在 1991 年开发的操作系统内核,它采用了 Unix 的设计哲学,并基于 GNU 项目提供的自由软件工具和组件构建而成。因为 Linux 内核以及与之相关的软件都是开源的,所以任何人都可以自由地使用、修改和分发 Linux。

Linux 和 Unix 之间的共同点在于它们都遵循了类 Unix 操作系统的原则和架构,包括使用 Shell 进行命令行操作、采用分层结构和模块化设计、支持多用户和多任务等。尽管 Linux 不是 Unix 的直接衍生物,但它借鉴了 Unix 的许多概念和设计,并通过不断发展和改进成为了现代计算机系统中广泛使用的操作系统之一。

模块

模块的全称是动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)

各种文件

.sh文件

“sh” 是一种文件扩展名,通常用于表示 Shell 脚本文件。Shell 脚本是一种文本文件,其中包含一系列的命令和指令,可以在操作系统的命令行界面上执行。”sh” 扩展名通常与 Bourne Shell 或其他类 Unix Shell 相关联,这些 Shell 是在类 Unix 系统中使用的命令行解释器。

通过编写 Shell 脚本,您可以自动化执行一系列命令,包括文件操作、程序运行、系统管理等。Shell 脚本非常有用,因为它们允许用户通过简单的脚本来批量处理任务,而无需手动逐个执行命令。

.xclbin文件

XCLBIN文件是一种特定的二进制文件格式,用于存储和表示FPGA(现场可编程门阵列)上的可执行硬件设计。XCLBIN代表”Xilinx Compiled Binary”,它是由赛灵思(Xilinx)公司的开发工具生成的。

在FPGA开发中,设计工程师通常使用HDL(硬件描述语言)编写硬件设计,如Verilog或VHDL。然后,他们使用赛灵思的开发工具将HDL代码综合、优化和编译为可在FPGA上执行的二进制文件。这个二进制文件就是XCLBIN文件。

XCLBIN文件包含了在FPGA上实现的各种逻辑和功能模块的配置信息和数据。它描述了FPGA中的逻辑电路、硬件模块、时序约束和其他相关信息。XCLBIN文件还包含了FPGA上运行的软件程序与硬件设计之间的接口信息。

.rpt文件

RPT文件通常是指”Report”(报告)文件。RPT文件是一种常见的文件格式,用于存储和显示应用程序生成的报告或日志信息。这种文件格式通常由特定的软件或应用程序使用,并且其具体内容和结构取决于创建它的软件。

不同的软件和应用程序可能使用RPT文件来保存不同类型的数据。例如,数据库软件(如Crystal Reports)使用RPT文件来保存生成的报告,包括表格、图表和其他数据可视化元素。另外,一些应用程序也可能使用RPT文件来记录错误日志、调试信息或其他程序运行时的详细信息。

.pyc文件

.pyc文件是Python源代码在被解释器执行之前经过编译后生成的字节码文件。当你运行Python程序时,解释器会首先将源代码转换为字节码形式,然后逐行执行字节码。这种编译和执行的过程使得Python程序可以更快地运行,因为解释器在执行字节码时可以跳过编译的步骤。

当你运行一个Python脚本时,解释器会检查是否存在对应的.pyc文件。如果存在,它会检查.pyc文件的时间戳是否与对应的.py文件相匹配。如果时间戳匹配,解释器会加载.pyc文件并执行其中的字节码,从而跳过重新编译源代码的过程,提高了程序的启动速度。如果.pyc文件不存在或者时间戳不匹配,解释器将重新编译源代码并生成新的.pyc文件。

.pyc文件通常与对应的.py文件位于同一目录下,并使用相同的文件名,只是扩展名不同。例如,如果你的Python脚本文件是 example.py,那么生成的.pyc文件将被命名为 example.pyc

需要注意的是,.pyc文件是与具体的Python解释器相关的,因此不同版本的解释器可能会生成不兼容的.pyc文件。如果你在不同的Python解释器版本之间切换,建议先删除旧的.pyc文件,以便解释器重新生成适用于当前版本的.pyc文件。

.scala文件

Scala是一种通用的编程语言,它结合了面向对象编程和函数式编程的特性。它的设计目标是提供一种高级的静态类型语,同时保持简洁和表达力。Scala运行在Java虚拟机(JVM)上,因此它可以与Java代码无缝地互操作**。

Scala源代码通常保存在以.scala为后缀的文件中。这些文件包含了用Scala编写的程序代码,可以通过Scala编译器进行编译,生成可在JVM上运行的字节码。Scala文件可以包含类、对象、特质(traits)以及函数和表达式等。

除了常规的Scala源文件外,还有一种叫做Scala脚本(Scala script)的文件类型,它的后缀为.sc。与传统的Scala源文件不同,Scala脚本可以直接在命令行中运行,而无需事先编译成字节码。脚本文件通常用于快速测试和执行简单任务。

无论是.scala文件还是.sc文件,都可以使用Scala编译器和解释器进行处理和执行。这使得Scala成为一种非常灵活和多用途的编程语言。

本文阅读量: 本站总访问量: 本站访客数: