提交 696b0253 编写于 作者: D dangqingqing

Refine paddle/v2/fluid/profiler.py.

上级 623f62a7
...@@ -29,10 +29,10 @@ void CudaProfilerInit(std::string output_file, std::string output_mode, ...@@ -29,10 +29,10 @@ void CudaProfilerInit(std::string output_file, std::string output_mode,
memcpy(buf.data(), tmpl.data(), tmpl.size()); memcpy(buf.data(), tmpl.data(), tmpl.size());
auto result = mktemp(buf.data()); auto result = mktemp(buf.data());
PADDLE_ENFORCE(strlen(result) != 0); PADDLE_ENFORCE(strlen(result) != 0);
std::string config = result; std::string config_file = result;
{ {
std::ofstream ofs(config, std::ios::out | std::ios::trunc); std::ofstream ofs(config_file, std::ios::out | std::ios::trunc);
PADDLE_ENFORCE(ofs.is_open(), "ofstream: ", ofs.rdstate()); PADDLE_ENFORCE(ofs.is_open(), "ofstream: ", ofs.rdstate());
for (const auto& line : config_flags) { for (const auto& line : config_flags) {
ofs << line << std::endl; ofs << line << std::endl;
...@@ -42,12 +42,12 @@ void CudaProfilerInit(std::string output_file, std::string output_mode, ...@@ -42,12 +42,12 @@ void CudaProfilerInit(std::string output_file, std::string output_mode,
PADDLE_ENFORCE(output_mode == "kvp" || output_mode == "csv"); PADDLE_ENFORCE(output_mode == "kvp" || output_mode == "csv");
cudaOutputMode_t mode = output_mode == "csv" ? cudaCSV : cudaKeyValuePair; cudaOutputMode_t mode = output_mode == "csv" ? cudaCSV : cudaKeyValuePair;
PADDLE_ENFORCE( PADDLE_ENFORCE(
cudaProfilerInitialize(config.c_str(), output_file.c_str(), mode)); cudaProfilerInitialize(config_file.c_str(), output_file.c_str(), mode));
} }
void CudaProfilerStart() { PADDLE_ENFORCE(cudaProfilerStart()); } void CudaProfilerStart() { PADDLE_ENFORCE(cudaProfilerStart()); }
void CudaProfilerStop() { PADDLE_ENFORCE((cudaProfilerStop())); } void CudaProfilerStop() { PADDLE_ENFORCE(cudaProfilerStop()); }
} // namespace platform } // namespace platform
} // namespace paddle } // namespace paddle
import paddle.v2.fluid.core as core import paddle.v2.fluid.core as core
import subprocess from contextlib import contextmanager
__all__ = ['CudaProfiler'] __all__ = ['CudaProfiler']
NV_FLAGS = [ NVPROF_CONFIG = [
"gpustarttimestamp", "gpustarttimestamp",
"gpuendtimestamp", "gpuendtimestamp",
"gridsize3d", "gridsize3d",
...@@ -14,61 +14,33 @@ NV_FLAGS = [ ...@@ -14,61 +14,33 @@ NV_FLAGS = [
] ]
def nvporf_init(output_file, output_mode=None, flags=None): @contextmanager
""" def cuda_profiler(output_file, output_mode=None, config=None):
Initialize the CUDA profiler. """The CUDA profiler.
This methods must be called before nvprof_start. This fuctions is used to profile CUDA program by CUDA runtime application
programming interface. The profiling result will be written into
:param output_file: The output file name. `output_file` with Key-Value pair format or Comma separated values format.
:type output_file: string The user can set the output mode by `output_mode` argument and set the
:param output_mode: The output mode has Key-Value pair format and counters/options for profiling by `config` argument. The default config
Comma separated values format. caontains 'gpustarttimestamp', 'gpustarttimestamp', 'gridsize3d',
It should be 'kv' or 'csv'. 'threadblocksize', 'streamid', 'enableonstart 0', 'conckerneltrace'.
:type output_mode: string
Args:
output_file (string) : The output file name, the result will be
written into this file.
output_mode (string) : The output mode has Key-Value pair format and
Comma separated values format. It should be 'kv' or 'csv'.
config (string) : The profiler options and counters can refer to
"Compute Command Line Profiler User Guide".
""" """
if output_mode is None: if output_mode is None:
output_mode = 'csv' output_mode = 'csv'
if output_mode not in ['kv', 'csv']: if output_mode not in ['kv', 'csv']:
raise ValueError("The output mode must be 'key-value' or 'csv'.") raise ValueError("The output mode must be 'key-value' or 'csv'.")
flags = NV_FLAGS if flags is None else flags config = NVPROF_CONFIG if config is None else config
core.nvprof_init(output_file, output_mode, flags) core.nvprof_init(output_file, output_mode, config)
# Enables profiler collection by the active CUDA profiling tool.
def nvporf_start():
"""
Enables profiler collection by the active CUDA profiling tool.
"""
core.nvprof_start() core.nvprof_start()
yield
# Disables profiler collection.
def nvporf_stop():
"""
Disables profiler collection.
"""
core.nvprof_stop() core.nvprof_stop()
class CudaProfiler(object):
def __init__(self, output_file, output_mode=None, flags=None, enabled=True):
self.enabled = enabled
if not self.enabled:
return
self.entered = False
self.out_file = output_file
nvporf_init(output_file, output_mode, flags)
def __enter__(self):
if not self.enabled:
return
if self.entered:
raise RuntimeError("The profiler traces are not reentrant")
self.entered = True
nvporf_start()
return self
def __exit__(self, exc_type, exc_value, tb):
if exc_value is not None:
raise exc_value
if not self.enabled:
return
nvporf_stop()
...@@ -18,7 +18,7 @@ class TestProfiler(unittest.TestCase): ...@@ -18,7 +18,7 @@ class TestProfiler(unittest.TestCase):
exe = fluid.Executor(place) exe = fluid.Executor(place)
exe.run(fluid.default_startup_program()) exe.run(fluid.default_startup_program())
with profiler.CudaProfiler("cuda_profiler.txt", 'csv') as nvprof: with profiler.cuda_profiler("cuda_profiler.txt", 'csv') as nvprof:
for i in range(epoc): for i in range(epoc):
input = np.random.random(dshape).astype("float32") input = np.random.random(dshape).astype("float32")
exe.run(fluid.default_main_program(), feed={'data': input}) exe.run(fluid.default_main_program(), feed={'data': input})
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册