Accel-Sim模拟器 编译、安装与运行

写在前面:
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.0

root@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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值