mock cuda runtime api
Project description
cuda-rt-hook(cuda_mock)
cuda-rt-hook(cuda_mock)是一个用于拦截CUDA/XPU Runtime接口(例如, cudaMalloc
和xpu_malloc
)调用的Python库,通过修改PLT(Procedure Linkage Table)来实现动态拦截,无需重新编译PyTorch、Paddle等复杂框架,安装后即可使用,在调用堆栈追踪、调用耗时统计以及Paddle/PyTorch训练和推理的精度调试和性能优化等场景下非常有用。
本项目的灵感来自于plthook项目。
安装
直接安装(建议)
pip install cuda_mock
从源码构建
git clone --recursive https://github.com/lipracer/cuda-rt-hook
cd cuda-rt-hook
python setup.py sdist bdist_wheel
pip install dist/*.whl
# 或者:
# python setup.py install
快速开始
找到Paddle/PyTorch模型的训练/推理脚本入口, 在首次import torch
/import paddle
之后添加如下代码:
import paddle
import cuda_mock; cuda_mock.xpu_initialize() # 加入这一行
或者
import torch
import cuda_mock; cuda_mock.xpu_initialize() # 加入这一行
根据实际的需求和场景设置cuda_mock的功能环境变量(参考功能使用演示章节),接着按照训练/推理脚本原有的执行方式运行脚本即可。
功能使用演示
功能1: 统计各个so库调用Runtime接口的次数和总耗时
LOG_LEVEL=WARN python run.py
在程序运行结束之后会显示:
功能2: 打印xpu_wait
的C++、C和Python调用堆栈
HOOK_ENABLE_TRACE="xpu_wait=1" python run.py
在程序运行结束之后会显示:
功能3: 统计模型训练/推理过程中的峰值内存
LOG_LEVEL=WARN python run.py
在程序运行结束之后会显示:
功能4: 打印Runtime接口的耗时
LOG_SYNC_MODE=1 LOG_LEVEL=PROFILE=INFO python run.py
在程序运行过程中会显示:
功能5: 收集CUDA算子调用堆栈
- 找到nvcc安装路径
which nvcc
- 用我们的nvcc替换系统的nvcc(我们只是在编译选项加了
-g
)
mv /usr/local/bin/nvcc /usr/local/bin/nvcc_b
chmod 777 tools/nvcc
cp tools/nvcc /usr/local/bin/nvcc
- 构建并且安装pytorch
- 构建并且安装cuda_mock
- 注意要在import torch之后import cuda_mock
- 开始跑你的训练脚本
- 我们将会把堆栈打印到控制台
环境变量
环境变量 | 默认值 | 简短说明 |
---|---|---|
LOG_LEVEL | WARN | 设置全局和各个日志模块的日志级别 |
HOOK_ENABLE_TRACE | 全部接口默认值为0(关闭backtrace) | 是否开启backtrace |
LOG_OUTPUT_PATH | "" | 是否将日志重定向到文件 |
LOG_SYNC_MODE | 0 | 是否使用同步日志输出 |
LOG_LEVEL
- 用法示例:
export LOG_LEVEL=WARN,TRACE=INFO
- 可选值:
- 日志级别: INFO, WARN, ERROR, FATAL
- 日志模块: PROFILE, TRACE, HOOK, PYTHON
- 默认值:
- 全局日志级别: WARN
- 各个日志模块的默认日志级别: WARN
- 说明: 设置全局和各个日志模块的日志级别
HOOK_ENABLE_TRACE
- 用法示例:
export HOOK_ENABLE_TRACE='xpu_memcpy=1,xpu_set_device=0'
- 可选值: xpu_malloc, xpu_free, xpu_wait, xpu_memcpy, xpu_set_device, xpu_current_device
- 默认值: 所有接口的默认值均为0,即所有接口默认关闭backtrace
- 说明: 是否开启backtrace
LOG_OUTPUT_PATH
- 用法示例:
export LOG_OUTPUT_PATH='/tmp/'
- 可选值: 日志输出文件夹
- 默认值: -
- 说明: 是否将日志重定向到文件, 默认是输出到标准输出
LOG_SYNC_MODE
- 用法示例:
export LOG_SYNC_MODE=1
- 可选值: 0 或 1
- 默认值: 0
- 说明: 是否使用同步日志输出,同步日志输出可能会影响主线程的执行时间,但可以使CUDA_MOCK输出的日志与其它日志系统输出保序
高级功能
实现自定义hook函数
实现自定义hook installer例子:
class PythonHookInstaller(cuda_mock.HookInstaller):
def is_target_lib(self, name):
return name.find("libcuda_mock_impl.so") != -1
def is_target_symbol(self, name):
return name.find("malloc") != -1
lib = cuda_mock.dynamic_obj(cpp_code, True).appen_compile_opts('-g').compile().get_lib()
installer = PythonHookInstaller(lib)
- 实现hook回调接口
PythonHookInstaller
- 构造函数需要传入自定义hook函数的库路径(绝对路径 并且 传入库中必须存在与要替换的函数名字以及类型一致的函数 在hook发生过程中,将会把原函数的地址写入以
__origin_
为开头目标symbol
接口的变量中,方便用户拿到原始函数地址 参考:test/py_test/test_import_mock.py:15
处定义) is_target_lib
是否是要hook的目标函数被调用的libraryis_target_symbol
是否是要hook的目标函数名字(上面接口返回True才回调到这个接口)new_symbol_name
构造函数中传入共享库中的新的用于替换的函数名字,参数name
:当前准备替换的函数名字dynamic_obj
可以运行时编译c++ code,支持引用所有模块:logger
、statistics
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
cuda-mock-0.1.11.tar.gz
(31.2 kB
view hashes)
Built Distributions
Close
Hashes for cuda_mock-0.1.11-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f68077841e48de68be0e8288f5f6f7c70bc59ac1dbffd4ae8602ed6fc3403557 |
|
MD5 | f9b77ec45c372f28d7c2e790983dcb27 |
|
BLAKE2b-256 | b5fe55cc17ca0842133e9be075ebcc39e048b0483ca877b8bf862f4f0978479f |
Close
Hashes for cuda_mock-0.1.11-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d8a494785fa7f01f26b8775ca183431975007bcdcc47bec6a5ac6eb993f9145a |
|
MD5 | fe133fafbaa0b3994471776e0bd57372 |
|
BLAKE2b-256 | 94612a6ef5ab5f1e9fd1f926e4441dceac08a31581ec7b5b60091542d013d117 |
Close
Hashes for cuda_mock-0.1.11-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 668e41d36ae58024b6d2e0c63eef2aa8b88502e38e3df14cb2374e451628857d |
|
MD5 | cbe324910caf15e5b0dba94a5947ed42 |
|
BLAKE2b-256 | cb4aef95edb597542b0968e6aa677bb98595dd75b40f840bfac742790aee8ba6 |
Close
Hashes for cuda_mock-0.1.11-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e102d51b47690debe37e6f0e4c850a1d5666e31afb2e7572089f90f5f02d4fea |
|
MD5 | 5a84a951d0f4ca5e9584fe3ceb1bbfb8 |
|
BLAKE2b-256 | b8ca3f9bd6b8141c5d31494c185cff5e7dbe1d7ec8f245b75c017d68dc60cf64 |
Close
Hashes for cuda_mock-0.1.11-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0eea93a1c5b89a8fd04a3307229e1d8b71f82f36c9d7685aafd56b9dff99bebe |
|
MD5 | 4dab7b49c226bf3fe1640e3639c9158f |
|
BLAKE2b-256 | becace8e211d6ce314993334055e24f466afc99a0cfcee259bfcbd9755ab98ff |
Close
Hashes for cuda_mock-0.1.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1dcb1e474c8c249d2b171e22e32f962f62f162b78bd391f23e81364087262240 |
|
MD5 | 504bf9e77f8ada0dbc5e1d626d37452f |
|
BLAKE2b-256 | 663c37575da2aef3601ea65d98c0e8a06d741c614a31992901be2e0147c93c4e |
Close
Hashes for cuda_mock-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1085f081cc11dd2221f652bac925819f01452ecd0d160bda23484c12221f0a17 |
|
MD5 | f122f72fd69eeb04378f4c17755833f7 |
|
BLAKE2b-256 | c152002f5e9d9f7477df735d40c139fe37a4d004833a8ce4e6e977cf7e1a399d |
Close
Hashes for cuda_mock-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4d0894cd2971a5937eed7fe70c3797c2773d8ae0e5182445d4e261769ad44f02 |
|
MD5 | 41bcd3bee6e9b0cee75d5787c9005b99 |
|
BLAKE2b-256 | 86bed6ac1475757f3e57ef8b488c5a1b89425b0eccd9b9ba86f9f97e2561f113 |
Close
Hashes for cuda_mock-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 04526cfb7ab732c9f47a195fdc9bb64de364b2ce25d0ff3bf236d6d11bc28fd9 |
|
MD5 | 7788a5d215f12e52722db253930a693e |
|
BLAKE2b-256 | 4775abc7d88a214b17213b0ecdd02f78b496dd4385a0c7ad219a082945908006 |
Close
Hashes for cuda_mock-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fc85a96868a0bf99be7a25b92e547ff5ffc652f47ee4bcd8248d8215c70693ed |
|
MD5 | 311f1dcb3d4f082404dae14799438362 |
|
BLAKE2b-256 | 1ac32ba35e255c95278e584b6dbbe57aa162fd0e13e17a9b3a05042ab2a6f233 |
Close
Hashes for cuda_mock-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 14bcb1a76e24fcb1e409aa991ab694fb117a1ea081bc2a1a65a6d708c5b60ffe |
|
MD5 | 6be9ac989f608432f5c774543a12cffc |
|
BLAKE2b-256 | 0bbbb56924c534c58f0675a9ba507e29d48a445ec064be6bd588d81ef047003f |
Close
Hashes for cuda_mock-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8a05804385a21c9456e2bae15e1a84e68c6af7bf1911896f6b3db107976702cc |
|
MD5 | cf9311473317074f534d5665840b833c |
|
BLAKE2b-256 | f785c533f3c9719f7697c681d86f546b9b9e376706111ac2c2ecb1091254c3a3 |
Close
Hashes for cuda_mock-0.1.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1a10490c16af4e3b7cbbd6b43a6caf9eabe9835bdddf9d3873cba0b473a806c3 |
|
MD5 | ea6761588d8ce6685c30828641c310d8 |
|
BLAKE2b-256 | f6a65d4e891a355404d2bf6a3bdcf623a596eaef1d1c98750d854b710600ac9d |