文章目录
写在前面:
Accel-Sim主要分成两部分,一部分是使用NVBit工具生成trace,另一部分是把trace导入gpgpusim进行模拟。
- gpgpusim是一个比较常见的GPU模拟器,网上也有单独的安装和使用教程,它的运行不需要真实GPU。
- 但是Accel-Sim这里的NVBit需要在真实GPU上面运行(据我所知)可以参考nvbit的仓库,https://github.com/NVlabs/NVBit,里面有Requirements(环境要求)。SM compute capability: >= 3.5 && <= 8.6;CUDA version: >= 8.0 && <= 11.x;
实验环境
ubuntu 20.04
电脑配有nvidia的gpu
docker版本20.10.9
主机的CUDA版本>=11.0root@ab3fdcf7da9e:/home/ubuntu/accel-sim-framework# nvidia-smi Tue May 31 13:15:54 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.43.04 Driver Version: 515.43.04 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA TITAN Xp On | 00000000:01:00.0 Off | N/A | | 23% 34C P8 10W / 250W | 11MiB / 12288MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
一、Accel-Sim模拟器组件分析
由于Accel-Sim涉及多个组件,而且几乎都是通过黑盒的脚本来运行,因此为了避免后续混淆,这里简单总结一下各个组件的作用以及注意事项。
组件介绍
Accel-Sim官网
Accel-Sim代码仓库
NVBit代码仓库
-
1、Accel-Sim Tracer
- An NVBit tool for generating SASS traces from CUDA applications.
- 基于NVBit这个GPU上面的二进制插桩工具(类似于CPU上的intel pin工具),对CUDA应用程序进行查找二进制插桩,然后得到SASS格式的trace文件。
- 依赖于真实的GPU,而且应该需要是英伟达的GPU。参考nvbit的仓库里面的环境要求:SM compute capability: >= 3.5 && <= 8.6;CUDA version: >= 8.0 && <= 11.x;CUDA driver version: <= 495.xx
- 使用的时候是通过
./util/tracer_nvbit/run_hw_trace.py
这个脚本来运行NVBit获取trace。
注意: run_hw_trace.py名字中的hw即说明它需要真实GPU环境。对应环境变量为
source ./gpu-app-collection/src/setup_environment
(不要与后面的./gpu-simulator/setup_environment.sh
弄混淆)输入是benchmark,输出是trace文件
具体的内容(包括trace生成过程以及trace格式参考Instructions on using tracer tool for Accel-sim)- 此外,官方好像提供了一个用于测试的trace文件,通过
./get-accel-sim-traces.py
获取。
-
2、Accel-Sim SASS Frontend
- A simulator frontend that consumes SASS traces and feeds them into a performance model. The intial release of Accel-Sim coincides with the release of GPGPU-Sim 4.0, which acts as the detailed performance model.
- 处理NVBit生成的SASS trace,将其导入GPGPUSim模拟器中
-
3、Simulation Engine
- 即GPGPUSim 4.0,常用的GPU模拟器。
- 不依赖于真实GPU
- 通常情况下,GPGPUSim是端到端的模拟,即直接运行应用程序,边运行workload边模拟。但是在Accel-Sim中,是先离线生成trace,再基于trace进行模拟。
- 使用的时候是通过
./hw_run/traces/get-accel-sim-traces.py
这个脚本来运行
依赖的环境变量配置为
./gpu-simulator/setup_environment.sh
(与前面run_hw_trace的不同),同时需要提前编译好gpgpusim(./gpu-simulator/bin/release/accel-sim.out
), -
4、Accel-Sim Correlator:
- A tool that matches, plots and correlates statistics from the performance model with real hardware statistics generated by profiling tools.
- 分析性能用的工具,通过
./util/hw_stats/run_hw.py
使用。根据名字中的hw
即知道它也依赖于真实GPU。
如果没记错的话,它的环境变量也是与
run_hw_trace
的相同,即./gpu-app-collection/src/setup_environment
,这一点官方文档没有标明,容易混淆。 -
Accel-Sim Tuner: An automated tuner that automates configuration file generation from a detailed microbenchmark suite.
- 调优工具,通过
./util/tuner/GPU_Microbenchmark/run_all.sh
。 - 没用过,略。
- 调优工具,通过
二、安装过程简述
如果要使用docker,就需要配置一些环境
安装步骤概述:
- 1、docker的GPU环境配置
- 1.1 安装docker
- 1.2 在主机上安装新版GPU驱动和新版cuda运行库
- 1.3 安装nvidia-container
- 1.4 测试
- 2、启动docker容器
- 3、编译运行benchmark
- 2.1 下载代码
- 2.2 下载数据
- 2.3 编译benchmark
- 2.4 查看trace
- 4、运行gpgpusim模拟器
二、docker的GPU环境配置
1.1 安装docker
我是使用deb文件安装的,官网有,下载之后sudo dpkg -i 那个deb文件
安装一下就行,具体步骤略。
注意docker版本不能很低,至少是docker 19之后(因为旧版的docker不支持GPU),我使用的docker版本为20.10.9
测试
docker --version
1.2 将当前用户添加到docker用户组
如果不添加普通用户到用户组的话,vscode里面的插件会识别不到container/docker
# 新建用户组
sudo groupadd docker
# 添加当前用户到docker用户组
sudo usermod -aG docker ${USER}
# 重启的docker
sudo systemctl restart docker
# 刷新
newgrp docker
# 测试
docker ps -a
1.3 在主机上安装新版GPU驱动和新版cuda运行库
由于旧版的cuda是不支持docker内运行gpu应用程序的,而cuda运行库的版本又需要GPU驱动的支持,因此我们需要电脑的GPU驱动版本和CUDA运行库版本是比较新的。(cuda>=11.0)
ps:如果不需要在docker中运行accel-sim,那么理论上不需要这么新的cuda和驱动,但是我没有试过,所以不太清楚。我是觉得docker的环境比较干净
cuda地址:https://developer.nvidia.com/cuda-downloads
GPU驱动我没有单独下载,因为本身就是符合要求的(Ubuntu 20.04)
1.4 安装nvidia-container
在更新完驱动版本和cuda版本后,还需要安装一个东西,叫nvidia-container,不然docker里面还是无法运行gpu应用程序。
官方教程地址:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
命令如下:
# 添加nvidia的仓库源(如果网络不好,也可以自行使用deb进行安装)
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 更新apt仓库
$ sudo apt update
# 安装nvidia-docker2
$ sudo apt install -y nvidia-docker2
# 重启docker
sudo systemctl restart docker
# 测试(在容器内运行nvidia-smi命令)
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
# 如果可以正常显示nvidia-smi的输出,说明docker容器可以正常识别gpu,否则说明配置的有问题。
1.5 测试
sudo docker run --gpus all --name accelsim-test --privileged -it --volume $(pwd):$(pwd) -w $(pwd) accelsim/ubuntu-18.04_cuda-11
export CUDA_INSTALL_PATH=/usr/local/cuda
export PATH=$CUDA_INSTALL_PATH/bin:$PATH
./util/tracer_nvbit/install_nvbit.sh # 需要下载一个东西
make -C ./util/tracer_nvbit/
ps:
1、如果运行install_nvbit.sh的时候,网络太差,也可以在另一台电脑上下载好,上传上去,修改一下脚本内容就行
2、运行make的时候,如果提示bc找不到(/bin/sh: 1: bc: not found),那就安装一下吧,apt install bc
使用docker pull镜像
docker pull accelsim/ubuntu-18.04_cuda-11:latest
安装cuda:https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local
安装nvidia-docker2
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt update
$ sudo apt install -y nvidia-docker2
sudo systemctl restart docker
测试
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
运行accel-sim
sudo docker run --name accelsim-test --privileged -it --volume $(pwd):$(pwd) -w $(pwd) accelsim/ubuntu-18.04_cuda-11:latest
删除容器
# 查看容器列表
sudo docker ps -a
# 删除某个容器,假设容器名字为accelsim-test
sudo docker rm accelsim-test
二、 Accel-Sim Tracer下载、安装并编译
2.1 仓库下载
git clone https://github.com/accel-sim/accel-sim-framework.git
2.2 环境变量设置(建议加到~/.bashrc
里面)
# 注意路径要正确
export CUDA_INSTALL_PATH=/usr/local/cuda
export PATH=$CUDA_INSTALL_PATH/bin:$PATH
source ~/.bashrc
# 测试环境变量
nvcc --version
2.3 安装nvbit
下载nvbit并安装,如果网络不好,可以用其他电脑下载,上传到服务器,修改下脚本内容让它跳过下载即可。命令如下:
# 当前目录为accel-sim仓库的主目录
./util/tracer_nvbit/install_nvbit.sh
# 编译组件
make -C ./util/tracer_nvbit/
2.4 benchmark编译以及测试数据的下载
# Make sure CUDA_INSTALL_PATH is set, and PATH includes nvcc
# Get the applications, their data files and build them:
# 注意克隆gpu-app-collection前切换当前路径到accel-sim-framework,也就是主仓库的根目录
git clone https://github.com/accel-sim/gpu-app-collection
# 这一步会出现一些error,是因为有一些库很老很老,新版不支持了,这个不用管。
# 注意,后面运行gpgpusim的时候,也有一个类似的命令:source ./gpu-simulator/setup_environment.sh,不要和这个搞混。
# 在nvibit中运行应用程序的时候,需要的环境变量是下面这个。
source ./gpu-app-collection/src/setup_environment
# 编译程序,编译好的目标文件可以在`accel-sim-framework/gpu-app-collection/bin/11.0/release`中找到
make -j -C ./gpu-app-collection/src rodinia_2.0-ft
# 下载数据并解压,如果网络太慢,可以在其它电脑上下载并上传
make -C ./gpu-app-collection/src data
# 运行,需要真实GPU
# 这一步会生成trace文件
# Run the applications with the tracer (remember you need a real GPU for this):
./util/tracer_nvbit/run_hw_trace.py -B rodinia_2.0-ft -D <gpu-device-num-to-run-on>
三、gpgpusim的编译与运行
# 安装依赖
pip3 install -r requirements.txt
# 导入gpgpusim的环境变量,建议开两个终端,一个用来运行nvibit(前面提到的),一个专门运行gpgpusim,以防止环境变量冲突。
source ./gpu-simulator/setup_environment.sh
# 编译模拟器
make -j -C ./gpu-simulator/
运行示例:
# 通过run_simulations.py脚本来运行模拟器
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C QV100-PTX -N myTest-PTX
参数说明:
PTX mode usage: ./util/job_launching/run_simulations.py -B <benchmark> -C <gpu_config> -N <run_identifier>
Optional:
[-B benchmark] (From the gpu-app-collection compiled in Step 1)
[-C gpu_config] (List of supported configs: accel-sim-framework/util/job_launching/configs/define-standard-cfgs.yml)
监测模拟器运行状态
./util/job_launching/monitor_func_test.py -v -N myTest
收集统计信息
./util/job_launching/get_stats.py -N myTest | tee stats.csv
四、 Accel-Sim Correlator
# 注意这个环境变量是对应nvibit的,因为我们是真机运行,而不是模拟器运行
source ./gpu-app-collection/src/setup_environment
# 运行run_hw.py脚本
./util/hw_stats/run_hw.py -B rodinia_2.0-ft
默认的profiler是nvprof,但是有的GPU可以用别的profiler,如nsight,命令如下(不过我这里好像不行)
./util/hw_stats/run_hw.py -B rodinia_2.0-ft --nsight_profiler --disable_nvprof
参考输出:
# ./util/hw_stats/run_hw.py -B rodinia_2.0-ft
....
PASSED
PARSEC Benchmark Suite
time = 0.268503
time pgain = 0.000000
time pgain_dist = 0.000000
time pgain_init = 0.000000
time pselect = 0.000026
time pspeedy = 0.000168
time pshuffle = 0.000016
time localSearch = 0.267768
====GPU Timing info====
time serial = 0.001810
time CPU to GPU memory copy = 0.001914
time GPU to CPU memory copy back = 0.001955
time GPU malloc = 0.073984
time GPU free = 0.000419
time kernel = 0.003213
PASSED
PARSEC Benchmark Suite
time = 0.393414
time pgain = 0.000000
time pgain_dist = 0.000000
time pgain_init = 0.000000
time pselect = 0.000011
time pspeedy = 0.000123
time pshuffle = 0.000014
time localSearch = 0.392668
====GPU Timing info====
time serial = 0.001781
time CPU to GPU memory copy = 0.001585
time GPU to CPU memory copy back = 0.001630
time GPU malloc = 0.091925
time GPU free = 0.000469
time kernel = 0.112056
PASSED
Running backprop-rodinia-2.0-ft
Running bfs-rodinia-2.0-ft
Running hotspot-rodinia-2.0-ft
Running heartwall-rodinia-2.0-ft
Running lud-rodinia-2.0-ft
Running nw-rodinia-2.0-ft
Running nn-rodinia-2.0-ft
Running pathfinder-rodinia-2.0-ft
Running srad_v2-rodinia-2.0-ft
Running streamcluster-rodinia-2.0-ft
五、Accel-Sim Tuner(略)
附录:出错记录
1、编译make -j -C ./gpu-app-collection/src rodinia_2.0-ft
的时候,出现链接问题(cannot find -lcutil_x86_64
)
详细报错信息如下:
$ make -j -C ./gpu-app-collection/src rodinia_2.0-ft
....
....
....
g++ -fPIC -m64 -o /root/accel-sim-framework/gpu-app-collection/src/..//bin/11.0/release/backprop-rodinia-2.0-ft obj_11.0/x86_64/release/facetrain.c.o obj_11.0/x86_64/release/imagenet.c.o obj_11.0/x86_64/release/backprop.c.o obj_11.0/x86_64/release/backprop_cuda.cu.o -L/usr/local/cuda-11.0/lib64 -L../../lib -L/root/accel-sim-framework/4.2/lib -L/root/accel-sim-framework/4.2/common/lib/linux -L/root/accel-sim-framework/4.2/shared/lib -L/root/accel-sim-framework/4.2/../4.2/C/lib -lcutil_x86_64 -lcudart -L/usr/local/cuda-11.0/lib64 -L../../lib -L/root/accel-sim-framework/4.2/lib -L/root/accel-sim-framework/4.2/common/lib/linux -L/root/accel-sim-framework/4.2/shared/lib -L/root/accel-sim-framework/4.2/../4.2/C/lib -lcutil_x86_64 -lcudart
/usr/bin/ld: cannot find -lcutil_x86_64
/usr/bin/ld: cannot find -lcutil_x86_64
collect2: error: ld returned 1 exit status
../../../common/common.mk:474: recipe for target '/root/accel-sim-framework/gpu-app-collection/src/..//bin/11.0/release/backprop-rodinia-2.0-ft' failed
make[1]: *** [/root/accel-sim-framework/gpu-app-collection/src/..//bin/11.0/release/backprop-rodinia-2.0-ft] Error 1
make[1]: Leaving directory '/root/accel-sim-framework/gpu-app-collection/src/cuda/rodinia/2.0-ft/backprop'
Makefile:31: recipe for target 'rodinia_2.0-ft' failed
make: *** [rodinia_2.0-ft] Error 2
make: Leaving directory '/root/accel-sim-framework/gpu-app-collection/src'
解决办法
1) 查找cutil_x86_64这个库的位置
$ find / -name libcutil_x86_64.a
/root/accel-sim-framework/gpu-app-collection/src/cuda/common/lib/libcutil_x86_64.a
2) 在makefile中添加路径参数
我这里选择在common.mk文件(gpu-app-collection/src/cuda/common/common.mk
)里添加一行代码,路径我直接写的绝对路径(简单但是移植性不好)
ADDITIONAL_LIBS += -L$(NVIDIA_COMPUTE_SDK_LOCATION)/../4.2/C/lib -lcutil_x86_64
ADDITIONAL_LIBS += -L/root/accel-sim-framework/gpu-app-collection/src/cuda/common/lib/
第一行是原本就有的,第二行是我新加的
docker里面运行GPU程序
需要host的CUDA版本>=11.0,否则会报错。(而CUDA版本对驱动版本也有要求)
ubuntu@ubuntu-16:~/lmy/accel-sim$ sudo systemctl restart docker
ubuntu@ubuntu-16:~/lmy/accel-sim$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.0, please update your driver to a newer version, or use an earlier cuda container: unknown.
2、 运行命令./util/tracer_nvbit/run_hw_trace.py -B rodinia_2.0-ft
时出错
出错信息
GPGPU-Sim ** ERROR: Cannot open config file 'gpgpusim.config'
分析:首先run_hw_trace.py脚本是直接使用真实GPU的,而gpgpusim.config文件是用gpgpusim模拟的。此处报错是因为我们的环境变量出问题了。最简单的办法就是重新开一个干净的终端,然后执行source ./gpu-app-collection/src/setup_environment
,然后再次运行./util/tracer_nvbit/run_hw_trace.py -B rodinia_2.0-ft
。