Transformer Hardware Friendly Accelerator_3
Colab Google
Colab介绍
Colab = “python版”Google doc + 免费GPU
- Jupyter Notebook : 在Colab中,python代码的执行是基于.ipynb文件,也就是Jupyter Notebook格式的python文件。这种笔记本文件与普通.py文件的区别是可以分块执行代码并立刻得到输出,同时也可以很方便地添加注释,这种互动式操作十分适合一些轻量的任务。
- 代码执行程序 : 代码执行程序就是Colab在云端的”服务器”。简单来说,我们先在笔记本写好需要运行的代码,连接到代码执行程序,然后Colab会在云端执行代码,最后把结果传回浏览器。
- 实例空间 : 连接到代码执行程序后,Colab需要为其分配实例空间(Instance),可以简单理解为运行笔记本而创建的”虚拟机”,其中包含了执行ipynb文件时的默认配置、环境变量、自带的库等等。
- 会话 : 当笔记本连接到代码执行程序并分配到实例空间后,就成为了一个会话(Session),用户能开启的回话数量是有限的
Colab工作流程
将工程文件上传到Google drive的Colab Notebook文件夹
笔记本界面
- 标题:笔记本的名称
- 代码块:分块执行的代码
- 文件浏览:Colab为笔记本分配的实例空间
- 代码执行程序:用于执行笔记本程序的服务器
- 代码段:常用的代码段,比如装载云端硬盘
- 命令面板:常用的命令,比如查找/替换
- 终端:文件浏览下的终端(非常卡,不建议使用)
连接代码执行程序
连接到代码执行程序并分配实例空间,此时可以看到消耗的RAM和磁盘
- RAM:虚拟机运行内存,更大内存意味着更大的算力
- 磁盘:虚拟机文件的储存空间
设置笔记本的运行时类型
运行:->代码执行程序->更改运行时类型即可->更改为GPU
断开:->代码执行程序->断开连接并删除运行时。colab加载文件
- colab里加载自己的谷歌云盘
加载成功以后(可以点一下刷新按钮)就可以看到云盘在实例空间中出现
1
2 from google.colab import drive
drive.mount('/content/drive')
谷歌云盘默认的加载路径是”/content/drive/MyDrive”
- 数据集以压缩包形式上传到谷歌云盘,然后解压到Colab实例空间
1
2
3
4 # 创建datasets文件夹,用来加载训练数据集
!mkdir /content/datasets
# 在当前目录下("/content")创建一个叫datasets的文件夹,并将"zhihu_colab"中的数据集解压到这个文件夹
!tar -xvf "/content/drive/MyDrive/zhihu_colab/ROD-synROD.tar" -C "/content/datasets"- 查看分到的GPU是什么
如果是T4,可以一直反复地刷显卡,断开运行时后再连接,不断重复直到刷出P100为止。
1
2
3
4
5
6 gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
print('Not connected to a GPU')
else:
print(gpu_info)
训练模型
1
2
3
4
5
6
7
8
9
10
11 !python3 /content/drive/MyDrive/zhihu_colab/
mldl_project/code/train_eval.py \
# \ 是表示流式输入输出(前一个命令的输出作为后一个命令的输入)
#--data_root 用于指定数据集的根目录
--data_root /content/datasets/ROD-synROD \
#--logdir 用于指定保持模型日志(checkpoint + tensorboard)的路径,注意一定要保存到云盘里
--logdir /content/drive/MyDrive/ \
#--resume 表示如果有checkpoint就加载checkpoint
--resume \
#tee 命令用于将输出保存到文件同时也打印到屏幕,-a表示add模式(如果文件已存在会添加而不是覆盖)
| tee /content/drive/MyDrive/synRODtoROD.txt -a
如何让代码有“断点续传”的能力?
由于Colab随时有可能断开连接,在Colab上训练模型的代码必须要有可恢复性(能载入上一次训练的结果)。
以下是两个分别实现保存和加载checkpoint的函数(基于pytorch)。
- 保存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 def save_checkpoint(path: Text,
epoch: int,
modules: Union[nn.Module, Sequence[nn.Module]],
optimizers: Union[opt.Optimizer, Sequence[opt.Optimizer]],
safe_replacement: bool = True):
"""
Save a checkpoint of the current state of the >training, so it can >be resumed.
This checkpointing function assumes that there are no >learning >rate schedulers or gradient scalers for >automatic
mixed precision.
:param path:
Path for your checkpoint file
:param epoch:
Current (completed) epoch
:param modules:
nn.Module containing the model or a list of nn.>Module objects
:param optimizers:
Optimizer or list of optimizers
:param safe_replacement:
Keep old checkpoint until the new one has been >completed
:return:
"""
# This function can be called both as
# save_checkpoint('/my/checkpoint/path.pth', my_epoch, >my_module, >my_opt)
# or
# save_checkpoint('/my/checkpoint/path.pth', my_epoch, >>[my_module1, my_module2], [my_opt1, my_opt2])
if isinstance(modules, nn.Module):
modules = [modules]
if isinstance(optimizers, opt.Optimizer):
optimizers = [optimizers]
# Data dictionary to be saved
data = {
'epoch': epoch,
# Current time (UNIX timestamp)
'time': time.time(),
# State dict for all the modules
'modules': [m.state_dict() for m in modules],
# State dict for all the optimizers
'optimizers': [o.state_dict() for o in optimizers]
}
# Safe replacement of old checkpoint
temp_file = None
if os.path.exists(path) and safe_replacement:
# There's an old checkpoint. Rename it!
temp_file = path + '.old'
os.rename(path, temp_file)
# Save the new checkpoint
with open(path, 'wb') as fp:
torch.save(data, fp)
# Flush and sync the FS
fp.flush()
os.fsync(fp.fileno())
# Remove the old checkpoint
if temp_file is not None:
os.unlink(path + '.old')- 加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 def load_checkpoint(path: Text,
default_epoch: int,
modules: Union[nn.Module, Sequence[nn.Module]],
optimizers: Union[opt.Optimizer, Sequence[opt.Optimizer]],
verbose: bool = True):
"""
Try to load a checkpoint to resume the training.
:param path:
Path for your checkpoint file
:param default_epoch:
Initial value for "epoch" (in case there are not >snapshots)
:param modules:
nn.Module containing the model or a list of nn.>Module objects. >They are assumed to stay on the >same device
:param optimizers:
Optimizer or list of optimizers
:param verbose:
Verbose mode
:return:
Next epoch
"""
if isinstance(modules, nn.Module):
modules = [modules]
if isinstance(optimizers, opt.Optimizer):
optimizers = [optimizers]
# If there's a checkpoint
if os.path.exists(path):
# Load data
data = torch.load(path, map_location=next(modules[0].parameters()).device)
# Inform the user that we are loading the >checkpoint
if verbose:
print(f"Loaded checkpoint saved at {datetime.fromtimestamp(data['time']).strftime('%Y-%m-%d >%H:%M:%S')}. "
f"Resuming from epoch {data['epoch']}")
# Load state for all the modules
for i, m in enumerate(modules):
modules[i].load_state_dict(data['modules'][i])
# Load state for all the optimizers
for i, o in enumerate(optimizers):
optimizers[i].load_state_dict(data['optimizers'][i])
# Next epoch
return data['epoch'] + 1
else:
return default_epoch- 在主程序train.py正式开始训练前,添加下面的语句:
1
2
3 # args.resume是命令行输入的参数,用于指示要不要加载上次训练的结果
if args.resume:
first_epoch = load_checkpoint(checkpoint_path, first_epoch, net_list, optims_list)- 在每个epoch训练结束后,保存checkpoint:
1
2
3
4 # Save checkpoint
# net_list是需要保存的网络列表,optims_list是需要保存的优化器列表
# 如果代码里用到了scheduler,那也要保存scheduler的列表。
save_checkpoint(checkpoint_path, epoch, net_list, optims_list)
VIVADO
vivado HLS
C to RTL
- 创建工程
资料 Vivado HLS入门
- 加载C/C++文件
空着不加载- 加载test bench文件
空着不加载
“test bench”(测试台)是一个用于模拟设计输入和观察输出的程序或文件,用于模拟输入信号并验证设计输出是否符合预期。测试台文件包含测试输入的生成、时钟信号的生成和其他必要的控制信号的生成;还包含对设计输出的监视和分析的代码。通过在测试台中模拟各种输入情况,设计工程师可以验证电路的行为,并进行调试和改进。
- 选择硬件芯片型号
创建完成:Source 包括我们的设计源文件,Test Bench是我们的仿真文件。- Add Source File
- 命名xxx.cpp
- run C Synthesis
验证C源代码:点击project>run c simulation 点击ok
- Add TestBench File
- 命名xxx_tb.cpp,save file
- run C Simulation**
验证C源代码:点击project>run c simulation 点击ok
- run C Synthesis
验证C源代码:点击solution>run c synthesis 点击ok
- run C/RTL co-simulation Dialog**
- RTL验证:点击solution>run c/rtl cosimulation>ok
- run Export RTL
- 输出RTL文件,创建IP
- choose verilog/VHDL
- Open Wave Viewer
vivado
VITIS
vitis HLS
vitis HLS 与 vivado HLS 本质上相同,只是换了一个UI界面的感觉
Vivado-hls使用实例-详细教程
作用
- 输入:Tesbench,C/C++源代码和Directives
- 输出:IP Catalog,DSP和SysGe
注意
- 一个工程只能有一个顶层函数用于综和,这个顶层函数下面的子函数也是可以被综合的,会生成相应的VHDL和Verilog代码,所以,C综合后的RTL代码结构通常是跟原始C描述的结构是一致的,除非是子函数功能很简单,所需要的逻辑量很小。
- 并不是所有的C/C++都可以被综合,动态内存分配和涉及到操作系统层面的操作不可以被综合。
流程
- 用户创建一个设计 C、C++ 或 SystemC 源代码,以及一个C的测试平台。通过 Vivado HLS Synthesis 运行设计,生成 RTL 设计,代码可以是 Verilog,也可以是 VHDL。
- 有了 RTL 后,随即可以执行设计的 Verilog 或 VHDL 仿真,或使用工具的C封装器技术创建 SystemC 版本。然后可以进行System C架构级仿真,进一步根据之前创建的 C 测试平台,验证设计的架构行为和功能。
- 设计固化后,就可以通过 Vivado 设计套件的物理实现流程来运行设计,将设计编程到器件上,在硬件中运行和/或使用IP封装器将设计转为可重用的IP。
vitis
LINUX
ubantu
vitis下载 —-在这里很坑⚠️🥹
- 首先是ubantu的安装,一开始是想安装在移动硬盘,但是后来安装的时候试了很多遍,死活识别不了移动硬盘,遂自能安装在自己的电脑硬盘中。
- vitis不支持ubantu最新版本,只支持2018.04.1~2018.04.4,于是在我三次尝试云下载,一次下载完整个安装包,花了总共600G流量,💰130人民币,总共四五次失败,且出现同一个报错之后。我终于上网,啊,看到了另一个老哥也是这个样子,just是因为ubantu版本不!支!持!(他的网站怎么就不能说明呢,会死吗?!没事的,我情绪很稳定🙂)
- 接下来就是安装步骤
在ubantu2018中不能像最新版本一样,右击就出现作为程序运行
以下为安装步骤:
- 解压tar.gz压缩包
- 点进去,右击空白处,”打开位于此处的终端”
- 输入 “sudo ./xsetup”
- 接下来就是正常安装步骤
- 打开软件
- 导航到settings64.sh文件处,空白处右击打开终端
- 输入 “source settings64.sh”
- 继续输入 “vitis/vitis HLS/vivado”
- 环境配置
- 输入:”sudo gedit .bashrc”
- 在文件的最后一行加入:
- source /安装目录/Vivado/2021.2/settings64.sh
- source /安装目录/Vitis/2021.2/settings64.sh
- source /安装目录/Vitis_HLS/2021.2/settings64.sh
- 保存文件,然后输入”source .bashrc”
- 报错出现
“the configuration area at’/home/ls/.xilinx/vitis/2023.1’could not be created.please choose a writable location using the ‘-configuration’ command line option.”
- xilinx论坛:https://support.xilinx.com/s/question/0D52E00006hpJjSSAU/cannot-lauch-sdk-20183-on-ubuntu-1604?language=en_US
出现的警告是由于安装时采用的sudo去安装的,所以文件夹和文件权限有限制,这里解除权限限制即可,打开终端输入:7.打开软件
1 "sudo chmod -R 777 Xilinx" //Xilinx 为安装路径- 终端输入vitis,打开vitis
- 终端输入vitis_hls,打开vitis_hls
- 终端输入vivado,打开vivado
路径
- 绝对路径:路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
- 相对路径:路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。
文件与目录管理命令
1
2
3
4
5
6
7
8 ls (英文全拼:list files): 列出目录及文件名
cd 英文全拼:change directory):切换目录 -------------cd .. 退回上一级目录
pwd (英文全拼:print work directory):显示目前的目录
mkdir (英文全拼:make directory):创建一个新的目录
rmdir (英文全拼:remove directory):删除一个空的目录
cp (英文全拼:copy file): 复制文件或目录
rm (英文全拼:remove): 删除文件或目录
mv (英文全拼:move file): 移动文件与目录,或修改文件与目录的名称













