From 34d07ad4c4a3540b0868d2290c9566a186e633be Mon Sep 17 00:00:00 2001 From: michaelshin Date: Tue, 18 Apr 2023 17:02:49 -0400 Subject: [PATCH] Rename everything to use deepview --- .../build-and-publish-new-version.yml | 2 +- README.md | 32 +++++------------- assets/deepview.png | Bin 0 -> 31981 bytes assets/skyline-wordmark.png | Bin 27558 -> 0 bytes {skyline => deepview_profile}/__init__.py | 0 {skyline => deepview_profile}/__main__.py | 20 +++++------ .../analysis/__init__.py | 0 .../analysis/request_manager.py | 12 +++---- .../analysis/runner.py | 4 +-- .../analysis/session.py | 20 +++++------ .../analysis/static.py | 0 .../commands/__init__.py | 0 .../commands/interactive.py | 10 +++--- .../commands/measurements.py | 12 +++---- .../commands/memory.py | 12 +++---- .../commands/prediction_models.py | 14 ++++---- .../commands/time.py | 12 +++---- .../config/__init__.py | 4 +-- .../data/__init__.py | 0 {skyline => deepview_profile}/data/hints.yml | 0 {skyline => deepview_profile}/db/__init__.py | 0 {skyline => deepview_profile}/db/database.py | 2 +- .../energy/__init__.py | 0 .../energy/measurer.py | 0 .../error_printing.py | 2 +- {skyline => deepview_profile}/evaluate.py | 12 +++---- {skyline => deepview_profile}/exceptions.py | 2 +- .../initialization.py | 10 +++--- {skyline => deepview_profile}/io/__init__.py | 0 .../io/connection.py | 2 +- .../io/connection_acceptor.py | 8 ++--- .../io/connection_manager.py | 4 +-- {skyline => deepview_profile}/io/sentinel.py | 0 {skyline => deepview_profile}/lru_cache.py | 0 .../models/__init__.py | 0 .../models/analysis.py | 2 +- .../models/source_map.py | 0 {skyline => deepview_profile}/nvml.py | 0 .../profiler/__init__.py | 4 +-- .../profiler/autograd.py | 2 +- .../profiler/backward.py | 0 .../profiler/iteration.py | 4 +-- .../profiler/operation.py | 4 +-- .../protocol/__init__.py | 0 .../protocol/message_handler.py | 10 +++--- .../protocol/message_sender.py | 6 ++-- .../protocol_gen/__init__.py | 0 .../protocol_gen/innpv_pb2.py | 0 {skyline => deepview_profile}/server.py | 14 ++++---- {skyline => deepview_profile}/skyline.py | 20 +++++------ .../tests/__init__.py | 0 .../tests/test_lru_cache.py | 2 +- .../tracking/__init__.py | 0 .../tracking/backward_interceptor.py | 4 +-- .../tracking/base.py | 0 .../tracking/breakdown.py | 0 .../tracking/call_stack.py | 0 .../tracking/callable_tracker.py | 6 ++-- .../tracking/hook_manager.py | 0 .../tracking/memory/__init__.py | 0 .../tracking/memory/activations.py | 12 +++---- .../tracking/memory/report.py | 4 +-- .../tracking/memory/report_queries.py | 0 .../tracking/memory/weights.py | 8 ++--- .../tracking/time/__init__.py | 0 .../tracking/time/operation.py | 10 +++--- .../tracking/time/report.py | 4 +-- .../tracking/time/report_queries.py | 0 .../tracking/tracker.py | 16 ++++----- .../tracking/utils.py | 0 .../user_code_utils.py | 6 ++-- .../version_utils.py | 0 examples/gnmt/README.md | 4 +-- protocol/Makefile | 2 +- pyproject.toml | 10 +++--- test/TESTING.md | 2 +- test/config.json | 6 ++-- test/test_database.py | 2 +- test/utils.py | 6 ++-- tools/common.sh | 2 +- tools/prepare-release.sh | 4 +-- 81 files changed, 179 insertions(+), 193 deletions(-) create mode 100644 assets/deepview.png delete mode 100644 assets/skyline-wordmark.png rename {skyline => deepview_profile}/__init__.py (100%) rename {skyline => deepview_profile}/__main__.py (52%) rename {skyline => deepview_profile}/analysis/__init__.py (100%) rename {skyline => deepview_profile}/analysis/request_manager.py (96%) rename {skyline => deepview_profile}/analysis/runner.py (93%) rename {skyline => deepview_profile}/analysis/session.py (97%) rename {skyline => deepview_profile}/analysis/static.py (100%) rename {skyline => deepview_profile}/commands/__init__.py (100%) rename {skyline => deepview_profile}/commands/interactive.py (86%) rename {skyline => deepview_profile}/commands/measurements.py (90%) rename {skyline => deepview_profile}/commands/memory.py (82%) rename {skyline => deepview_profile}/commands/prediction_models.py (87%) rename {skyline => deepview_profile}/commands/time.py (83%) rename {skyline => deepview_profile}/config/__init__.py (87%) rename {skyline => deepview_profile}/data/__init__.py (100%) rename {skyline => deepview_profile}/data/hints.yml (100%) rename {skyline => deepview_profile}/db/__init__.py (100%) rename {skyline => deepview_profile}/db/database.py (96%) rename {skyline => deepview_profile}/energy/__init__.py (100%) rename {skyline => deepview_profile}/energy/measurer.py (100%) rename {skyline => deepview_profile}/error_printing.py (91%) rename {skyline => deepview_profile}/evaluate.py (51%) rename {skyline => deepview_profile}/exceptions.py (97%) rename {skyline => deepview_profile}/initialization.py (85%) rename {skyline => deepview_profile}/io/__init__.py (100%) rename {skyline => deepview_profile}/io/connection.py (98%) rename {skyline => deepview_profile}/io/connection_acceptor.py (90%) rename {skyline => deepview_profile}/io/connection_manager.py (93%) rename {skyline => deepview_profile}/io/sentinel.py (100%) rename {skyline => deepview_profile}/lru_cache.py (100%) rename {skyline => deepview_profile}/models/__init__.py (100%) rename {skyline => deepview_profile}/models/analysis.py (98%) rename {skyline => deepview_profile}/models/source_map.py (100%) rename {skyline => deepview_profile}/nvml.py (100%) rename {skyline => deepview_profile}/profiler/__init__.py (90%) rename {skyline => deepview_profile}/profiler/autograd.py (97%) rename {skyline => deepview_profile}/profiler/backward.py (100%) rename {skyline => deepview_profile}/profiler/iteration.py (98%) rename {skyline => deepview_profile}/profiler/operation.py (97%) rename {skyline => deepview_profile}/protocol/__init__.py (100%) rename {skyline => deepview_profile}/protocol/message_handler.py (93%) rename {skyline => deepview_profile}/protocol/message_sender.py (95%) rename {skyline => deepview_profile}/protocol_gen/__init__.py (100%) rename {skyline => deepview_profile}/protocol_gen/innpv_pb2.py (100%) rename {skyline => deepview_profile}/server.py (86%) rename {skyline => deepview_profile}/skyline.py (50%) rename {skyline => deepview_profile}/tests/__init__.py (100%) rename {skyline => deepview_profile}/tests/test_lru_cache.py (99%) rename {skyline => deepview_profile}/tracking/__init__.py (100%) rename {skyline => deepview_profile}/tracking/backward_interceptor.py (84%) rename {skyline => deepview_profile}/tracking/base.py (100%) rename {skyline => deepview_profile}/tracking/breakdown.py (100%) rename {skyline => deepview_profile}/tracking/call_stack.py (100%) rename {skyline => deepview_profile}/tracking/callable_tracker.py (95%) rename {skyline => deepview_profile}/tracking/hook_manager.py (100%) rename {skyline => deepview_profile}/tracking/memory/__init__.py (100%) rename {skyline => deepview_profile}/tracking/memory/activations.py (95%) rename {skyline => deepview_profile}/tracking/memory/report.py (96%) rename {skyline => deepview_profile}/tracking/memory/report_queries.py (100%) rename {skyline => deepview_profile}/tracking/memory/weights.py (87%) rename {skyline => deepview_profile}/tracking/time/__init__.py (100%) rename {skyline => deepview_profile}/tracking/time/operation.py (88%) rename {skyline => deepview_profile}/tracking/time/report.py (93%) rename {skyline => deepview_profile}/tracking/time/report_queries.py (100%) rename {skyline => deepview_profile}/tracking/tracker.py (90%) rename {skyline => deepview_profile}/tracking/utils.py (100%) rename {skyline => deepview_profile}/user_code_utils.py (91%) rename {skyline => deepview_profile}/version_utils.py (100%) diff --git a/.github/workflows/build-and-publish-new-version.yml b/.github/workflows/build-and-publish-new-version.yml index 9ef2518..26e2ab3 100644 --- a/.github/workflows/build-and-publish-new-version.yml +++ b/.github/workflows/build-and-publish-new-version.yml @@ -10,7 +10,7 @@ on: jobs: build: if: (startsWith(github.head_ref, 'release-') && github.event.pull_request.merged == true) - name: Build Skyline + name: Build DeepView.Profile runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index b8710e2..10489d3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -![Skyline](https://raw.githubusercontent.com/skylineprof/skyline/master/assets/skyline-wordmark.png) -[![License](https://img.shields.io/badge/license-Apache--2.0-green?style=flat)](https://github.com/CentML/skyline/blob/main/LICENSE) -![](https://img.shields.io/pypi/pyversions/skyline-profiler.svg) -[![](https://img.shields.io/pypi/v/skyline-profiler.svg)](https://pypi.org/project/skyline-profiler/) +![DeepView](https://raw.githubusercontent.com/CentML/DeepView.Profile/main/assets/deepview.png) +[![License](https://img.shields.io/badge/license-Apache--2.0-green?style=flat)](https://github.com/CentML/DeepView.Profile/blob/main/LICENSE) +![](https://img.shields.io/pypi/pyversions/deepview-profile.svg) +[![](https://img.shields.io/pypi/v/deepview-profile.svg)](https://pypi.org/project/deepview-profile/) DeepView.Profile is a tool to profile and debug the training performance of [PyTorch](https://pytorch.org) neural networks. @@ -40,24 +40,10 @@ poetry run deepview --help ### Installation from PyPi -**Note:** Not implemented yet - -Installing with [Poetry](https://python-poetry.org/) -```zsh -poetry add deepview-profiler -poetry run deepview --help -``` - -Installing with [Pipenv](https://pipenv.pypa.io/en/latest/) -```zsh -pipenv install deepview-profiler -pipenv run deepview --help -``` - Installing with [Pip](https://packaging.python.org/en/latest/tutorials/installing-packages/#use-pip-for-installing) ```zsh python3 -m pip install deepview-profiler -python3 skyline +python3 -m deepview -h ```

Usage example

@@ -80,14 +66,14 @@ file where you want DeepView.Profile to save the run time profiling report using `--output` or `-o` flag. ```zsh -poetry run deepview time entry_point.py --output my_output_file.sqlite +python3 -m deepview time entry_point.py --output my_output_file.sqlite ``` Launching memory profiling is almost the same as launching run time profiling. You just need to use `deepview memory` instead of `deepview time`. ```zsh -poetry run deepview memory entry_point.py --output my_output_file.sqlite +python3 -m deepview memory entry_point.py --output my_output_file.sqlite ```

Development Environment Setup

@@ -106,12 +92,12 @@ poetry install 1. After the PR is merged [build-and-publish-new-version.yml](.github/workflows/build-and-publish-new-version.yml) GitHub action will: * build the Python Wheels * GitHub release - * Try to publish to Test PyPI + * Publish to Test PyPI * Subject to approval publish to PyPI

Release History

-See [Releases](https://github.com/UofT-EcoSystem/skyline/releases) +See [Releases](https://github.com/CentML/DeepView.Profile/releases)

Meta

diff --git a/assets/deepview.png b/assets/deepview.png new file mode 100644 index 0000000000000000000000000000000000000000..59d6863c93d03c1713b83e673c766b422a3c45fd GIT binary patch literal 31981 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 literal 0 HcmV?d00001 diff --git a/assets/skyline-wordmark.png b/assets/skyline-wordmark.png deleted file mode 100644 index e0fa4b37147ea5ddc3d3d61e483ef4379b408f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27558 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", str(error), file=file) diff --git a/skyline/evaluate.py b/deepview_profile/evaluate.py similarity index 51% rename from skyline/evaluate.py rename to deepview_profile/evaluate.py index ba055fb..c7d7518 100644 --- a/skyline/evaluate.py +++ b/deepview_profile/evaluate.py @@ -2,18 +2,18 @@ import enum import sys -import skyline.commands.measurements -import skyline.commands.prediction_models +import deepview_profile.commands.measurements +import deepview_profile.commands.prediction_models def main(): parser = argparse.ArgumentParser( - prog="skyline-evaluate", - description="Skyline Evaluation Tool", + prog="deepview-evaluate", + description="DeepView Evaluation Tool", ) subparsers = parser.add_subparsers(title="Commands") - skyline.commands.measurements.register_command(subparsers) - skyline.commands.prediction_models.register_command(subparsers) + deepview_profile.commands.measurements.register_command(subparsers) + deepview_profile.commands.prediction_models.register_command(subparsers) args = parser.parse_args() if 'func' not in args: diff --git a/skyline/exceptions.py b/deepview_profile/exceptions.py similarity index 97% rename from skyline/exceptions.py rename to deepview_profile/exceptions.py index b2d2282..bd3c173 100644 --- a/skyline/exceptions.py +++ b/deepview_profile/exceptions.py @@ -61,7 +61,7 @@ def exceptions_as_analysis_errors(project_root): ) if isinstance(ex, SyntaxError): error = AnalysisError( - 'Skyline encountered a syntax error while profiling your ' + 'DeepView encountered a syntax error while profiling your ' 'model.' ) else: diff --git a/skyline/initialization.py b/deepview_profile/initialization.py similarity index 85% rename from skyline/initialization.py rename to deepview_profile/initialization.py index 0e0444d..004e0bd 100644 --- a/skyline/initialization.py +++ b/deepview_profile/initialization.py @@ -8,7 +8,7 @@ def check_skyline_preconditions(args): """ This is the first function that should run before importing any other - Skyline code. + DeepView code. """ _configure_logging(args) if not _validate_dependencies(): @@ -21,7 +21,7 @@ def initialize_skyline(args): """ Performs common initialization tasks. """ - from skyline.config import Config + from deepview_profile.config import Config Config.parse_args(args) @@ -50,9 +50,9 @@ def _validate_dependencies(): return True except ImportError as ex: logger.error( - "Deepview could not find the '%s' module, which is a required " + "DeepView could not find the '%s' module, which is a required " "dependency. Please make sure all the required dependencies are " - "installed before launching Deepview. If you use a package " + "installed before launching DeepView. If you use a package " "manager, these dependencies will be automatically installed for " "you.", ex.name, @@ -64,7 +64,7 @@ def _validate_gpu(): import torch if not torch.cuda.is_available(): logger.error( - "Deepview did not detect a GPU on this machine. Deepview only " + "DeepView did not detect a GPU on this machine. DeepView only " "profiles deep learning workloads on GPUs." ) return False diff --git a/skyline/io/__init__.py b/deepview_profile/io/__init__.py similarity index 100% rename from skyline/io/__init__.py rename to deepview_profile/io/__init__.py diff --git a/skyline/io/connection.py b/deepview_profile/io/connection.py similarity index 98% rename from skyline/io/connection.py rename to deepview_profile/io/connection.py index 9a46884..f6b7008 100644 --- a/skyline/io/connection.py +++ b/deepview_profile/io/connection.py @@ -3,7 +3,7 @@ import struct from threading import Thread -from skyline.io.sentinel import Sentinel +from deepview_profile.io.sentinel import Sentinel logger = logging.getLogger(__name__) diff --git a/skyline/io/connection_acceptor.py b/deepview_profile/io/connection_acceptor.py similarity index 90% rename from skyline/io/connection_acceptor.py rename to deepview_profile/io/connection_acceptor.py index cefc42c..5fac0ea 100644 --- a/skyline/io/connection_acceptor.py +++ b/deepview_profile/io/connection_acceptor.py @@ -4,7 +4,7 @@ import logging from threading import Thread -from skyline.io.sentinel import Sentinel +from deepview_profile.io.sentinel import Sentinel logger = logging.getLogger(__name__) @@ -40,7 +40,7 @@ def start(self): self._sentinel.start() self._acceptor.start() logger.debug( - "Deepview is listening for connections on (%s:%d).", + "DeepView is listening for connections on (%s:%d).", self._host, self._port, ) @@ -51,7 +51,7 @@ def stop(self): self._server_socket.close() self._sentinel.stop() logging.debug( - "Deepview has stopped listening for connections on (%s:%d).", + "DeepView has stopped listening for connections on (%s:%d).", self._host, self._port, ) @@ -80,4 +80,4 @@ def _accept_connections(self): self._handler_function(socket, address) except: logging.exception( - "Deepview has unexpectedly stopped accepting connections.") + "DeepView has unexpectedly stopped accepting connections.") diff --git a/skyline/io/connection_manager.py b/deepview_profile/io/connection_manager.py similarity index 93% rename from skyline/io/connection_manager.py rename to deepview_profile/io/connection_manager.py index ed40288..bbd017d 100644 --- a/skyline/io/connection_manager.py +++ b/deepview_profile/io/connection_manager.py @@ -1,8 +1,8 @@ import logging import socket -from skyline.io.connection import Connection, ConnectionState -from skyline.exceptions import NoConnectionError +from deepview_profile.io.connection import Connection, ConnectionState +from deepview_profile.exceptions import NoConnectionError logger = logging.getLogger(__name__) diff --git a/skyline/io/sentinel.py b/deepview_profile/io/sentinel.py similarity index 100% rename from skyline/io/sentinel.py rename to deepview_profile/io/sentinel.py diff --git a/skyline/lru_cache.py b/deepview_profile/lru_cache.py similarity index 100% rename from skyline/lru_cache.py rename to deepview_profile/lru_cache.py diff --git a/skyline/models/__init__.py b/deepview_profile/models/__init__.py similarity index 100% rename from skyline/models/__init__.py rename to deepview_profile/models/__init__.py diff --git a/skyline/models/analysis.py b/deepview_profile/models/analysis.py similarity index 98% rename from skyline/models/analysis.py rename to deepview_profile/models/analysis.py index bb443ff..b3d9806 100644 --- a/skyline/models/analysis.py +++ b/deepview_profile/models/analysis.py @@ -1,4 +1,4 @@ -from skyline.models.source_map import Position +from deepview_profile.models.source_map import Position class OperationInfo: diff --git a/skyline/models/source_map.py b/deepview_profile/models/source_map.py similarity index 100% rename from skyline/models/source_map.py rename to deepview_profile/models/source_map.py diff --git a/skyline/nvml.py b/deepview_profile/nvml.py similarity index 100% rename from skyline/nvml.py rename to deepview_profile/nvml.py diff --git a/skyline/profiler/__init__.py b/deepview_profile/profiler/__init__.py similarity index 90% rename from skyline/profiler/__init__.py rename to deepview_profile/profiler/__init__.py index 6f9a94d..cbdf395 100644 --- a/skyline/profiler/__init__.py +++ b/deepview_profile/profiler/__init__.py @@ -1,7 +1,7 @@ import torch -from skyline.exceptions import AnalysisError -from skyline.models.analysis import PerformanceLimits +from deepview_profile.exceptions import AnalysisError +from deepview_profile.models.analysis import PerformanceLimits def to_trainable_model(parse_tree, class_name): diff --git a/skyline/profiler/autograd.py b/deepview_profile/profiler/autograd.py similarity index 97% rename from skyline/profiler/autograd.py rename to deepview_profile/profiler/autograd.py index 7709455..0f26f2a 100644 --- a/skyline/profiler/autograd.py +++ b/deepview_profile/profiler/autograd.py @@ -1,6 +1,6 @@ import torch -from skyline.profiler.backward import get_grad_fn, flatten_operation_output +from deepview_profile.profiler.backward import get_grad_fn, flatten_operation_output class AutogradEngine: diff --git a/skyline/profiler/backward.py b/deepview_profile/profiler/backward.py similarity index 100% rename from skyline/profiler/backward.py rename to deepview_profile/profiler/backward.py diff --git a/skyline/profiler/iteration.py b/deepview_profile/profiler/iteration.py similarity index 98% rename from skyline/profiler/iteration.py rename to deepview_profile/profiler/iteration.py index 0294c5f..824b453 100644 --- a/skyline/profiler/iteration.py +++ b/deepview_profile/profiler/iteration.py @@ -3,8 +3,8 @@ import torch -from skyline.exceptions import AnalysisError -from skyline.user_code_utils import user_code_environment +from deepview_profile.exceptions import AnalysisError +from deepview_profile.user_code_utils import user_code_environment logger = logging.getLogger(__name__) diff --git a/skyline/profiler/operation.py b/deepview_profile/profiler/operation.py similarity index 97% rename from skyline/profiler/operation.py rename to deepview_profile/profiler/operation.py index a3d3128..9707e15 100644 --- a/skyline/profiler/operation.py +++ b/deepview_profile/profiler/operation.py @@ -1,8 +1,8 @@ import torch import logging -from skyline.profiler.autograd import AutogradEngine -from skyline.profiler.backward import BackwardHelper, backward_available +from deepview_profile.profiler.autograd import AutogradEngine +from deepview_profile.profiler.backward import BackwardHelper, backward_available logger = logging.getLogger(__name__) diff --git a/skyline/protocol/__init__.py b/deepview_profile/protocol/__init__.py similarity index 100% rename from skyline/protocol/__init__.py rename to deepview_profile/protocol/__init__.py diff --git a/skyline/protocol/message_handler.py b/deepview_profile/protocol/message_handler.py similarity index 93% rename from skyline/protocol/message_handler.py rename to deepview_profile/protocol/message_handler.py index 7827837..14f096d 100644 --- a/skyline/protocol/message_handler.py +++ b/deepview_profile/protocol/message_handler.py @@ -2,9 +2,9 @@ import logging import os -from skyline.exceptions import AnalysisError, NoConnectionError +from deepview_profile.exceptions import AnalysisError, NoConnectionError -import skyline.protocol_gen.innpv_pb2 as pm +import deepview_profile.protocol_gen.innpv_pb2 as pm logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ def _validate_paths(project_root, entry_point): if not os.path.isabs(project_root): logger.error( - "The project root that Skyline received is not an absolute path. " + "The project root that DeepView received is not an absolute path. " "This is an unexpected error. Please report a bug." ) logger.error("Current project root: %s", project_root) @@ -75,8 +75,8 @@ def _handle_initialize_request(self, message, context): ) self._connection_manager.remove_connection(context.address) logger.error( - 'Skyline is out of date. Please update to the latest versions ' - 'of the Skyline command line interface and plugin.' + 'DeepView is out of date. Please update to the latest versions ' + 'of the DeepView command line interface and plugin.' ) return diff --git a/skyline/protocol/message_sender.py b/deepview_profile/protocol/message_sender.py similarity index 95% rename from skyline/protocol/message_sender.py rename to deepview_profile/protocol/message_sender.py index f820d47..318eab8 100644 --- a/skyline/protocol/message_sender.py +++ b/deepview_profile/protocol/message_sender.py @@ -4,10 +4,10 @@ import platform from random import random -from skyline.config import Config -from skyline.exceptions import NoConnectionError +from deepview_profile.config import Config +from deepview_profile.exceptions import NoConnectionError -import skyline.protocol_gen.innpv_pb2 as pm +import deepview_profile.protocol_gen.innpv_pb2 as pm logger = logging.getLogger(__name__) diff --git a/skyline/protocol_gen/__init__.py b/deepview_profile/protocol_gen/__init__.py similarity index 100% rename from skyline/protocol_gen/__init__.py rename to deepview_profile/protocol_gen/__init__.py diff --git a/skyline/protocol_gen/innpv_pb2.py b/deepview_profile/protocol_gen/innpv_pb2.py similarity index 100% rename from skyline/protocol_gen/innpv_pb2.py rename to deepview_profile/protocol_gen/innpv_pb2.py diff --git a/skyline/server.py b/deepview_profile/server.py similarity index 86% rename from skyline/server.py rename to deepview_profile/server.py index 0fd4068..c22727e 100644 --- a/skyline/server.py +++ b/deepview_profile/server.py @@ -1,11 +1,11 @@ import logging from concurrent.futures import ThreadPoolExecutor -from skyline.analysis.request_manager import AnalysisRequestManager -from skyline.io.connection_acceptor import ConnectionAcceptor -from skyline.io.connection_manager import ConnectionManager -from skyline.protocol.message_handler import MessageHandler -from skyline.protocol.message_sender import MessageSender +from deepview_profile.analysis.request_manager import AnalysisRequestManager +from deepview_profile.io.connection_acceptor import ConnectionAcceptor +from deepview_profile.io.connection_manager import ConnectionManager +from deepview_profile.protocol.message_handler import MessageHandler +from deepview_profile.protocol.message_sender import MessageSender logger = logging.getLogger(__name__) @@ -47,7 +47,7 @@ def __exit__(self, exc_type, exc_value, traceback): def start(self): self._analysis_request_manager.start() self._connection_acceptor.start() - logger.debug("Deepview server has started.") + logger.debug("DeepView server has started.") def stop(self): def shutdown(): @@ -57,7 +57,7 @@ def shutdown(): self._analysis_request_manager.stop() self._main_executor.submit(shutdown).result() self._main_executor.shutdown() - logger.debug("Deepview server has shut down.") + logger.debug("DeepView server has shut down.") @property def listening_on(self): diff --git a/skyline/skyline.py b/deepview_profile/skyline.py similarity index 50% rename from skyline/skyline.py rename to deepview_profile/skyline.py index 32b2353..fb2fa70 100644 --- a/skyline/skyline.py +++ b/deepview_profile/skyline.py @@ -4,16 +4,16 @@ import toml -import skyline -import skyline.commands.interactive -import skyline.commands.memory -import skyline.commands.time +import deepview_profile +import deepview_profile.commands.interactive +import deepview_profile.commands.memory +import deepview_profile.commands.time def main(): parser = argparse.ArgumentParser( - prog = skyline.__name__, - description = skyline.__description__ + prog = deepview_profile.__name__, + description = deepview_profile.__description__ ) parser.add_argument( "-v", "--version", @@ -21,13 +21,13 @@ def main(): help="Print the version and exit.", ) subparsers = parser.add_subparsers(title="Commands") - skyline.commands.interactive.register_command(subparsers) - skyline.commands.memory.register_command(subparsers) - skyline.commands.time.register_command(subparsers) + deepview_profile.commands.interactive.register_command(subparsers) + deepview_profile.commands.memory.register_command(subparsers) + deepview_profile.commands.time.register_command(subparsers) args = parser.parse_args() if args.version: - print('Deepview Command Line Interface', 'v' + skyline.__version__,) + print('DeepView Command Line Interface', 'v' + deepview_profile.__version__,) return if 'func' not in args: diff --git a/skyline/tests/__init__.py b/deepview_profile/tests/__init__.py similarity index 100% rename from skyline/tests/__init__.py rename to deepview_profile/tests/__init__.py diff --git a/skyline/tests/test_lru_cache.py b/deepview_profile/tests/test_lru_cache.py similarity index 99% rename from skyline/tests/test_lru_cache.py rename to deepview_profile/tests/test_lru_cache.py index 8df119a..0b31897 100644 --- a/skyline/tests/test_lru_cache.py +++ b/deepview_profile/tests/test_lru_cache.py @@ -1,6 +1,6 @@ import unittest -import skyline.lru_cache as lru +import deepview_profile.lru_cache as lru class LRUCacheTests(unittest.TestCase): diff --git a/skyline/tracking/__init__.py b/deepview_profile/tracking/__init__.py similarity index 100% rename from skyline/tracking/__init__.py rename to deepview_profile/tracking/__init__.py diff --git a/skyline/tracking/backward_interceptor.py b/deepview_profile/tracking/backward_interceptor.py similarity index 84% rename from skyline/tracking/backward_interceptor.py rename to deepview_profile/tracking/backward_interceptor.py index 370a8f7..2676ef3 100644 --- a/skyline/tracking/backward_interceptor.py +++ b/deepview_profile/tracking/backward_interceptor.py @@ -1,8 +1,8 @@ import contextlib import torch -from skyline.exceptions import _SuspendExecution -from skyline.tracking.hook_manager import HookManager +from deepview_profile.exceptions import _SuspendExecution +from deepview_profile.tracking.hook_manager import HookManager class BackwardInterceptor: diff --git a/skyline/tracking/base.py b/deepview_profile/tracking/base.py similarity index 100% rename from skyline/tracking/base.py rename to deepview_profile/tracking/base.py diff --git a/skyline/tracking/breakdown.py b/deepview_profile/tracking/breakdown.py similarity index 100% rename from skyline/tracking/breakdown.py rename to deepview_profile/tracking/breakdown.py diff --git a/skyline/tracking/call_stack.py b/deepview_profile/tracking/call_stack.py similarity index 100% rename from skyline/tracking/call_stack.py rename to deepview_profile/tracking/call_stack.py diff --git a/skyline/tracking/callable_tracker.py b/deepview_profile/tracking/callable_tracker.py similarity index 95% rename from skyline/tracking/callable_tracker.py rename to deepview_profile/tracking/callable_tracker.py index ba25ee0..4ca6a79 100644 --- a/skyline/tracking/callable_tracker.py +++ b/deepview_profile/tracking/callable_tracker.py @@ -2,9 +2,9 @@ import torch -from skyline.tracking.base import TrackerBase -from skyline.tracking.hook_manager import HookManager -from skyline.version_utils import Version +from deepview_profile.tracking.base import TrackerBase +from deepview_profile.tracking.hook_manager import HookManager +from deepview_profile.version_utils import Version OLD_VF_PATH_VERSION = Version.parse_semantic_version('1.4.0') diff --git a/skyline/tracking/hook_manager.py b/deepview_profile/tracking/hook_manager.py similarity index 100% rename from skyline/tracking/hook_manager.py rename to deepview_profile/tracking/hook_manager.py diff --git a/skyline/tracking/memory/__init__.py b/deepview_profile/tracking/memory/__init__.py similarity index 100% rename from skyline/tracking/memory/__init__.py rename to deepview_profile/tracking/memory/__init__.py diff --git a/skyline/tracking/memory/activations.py b/deepview_profile/tracking/memory/activations.py similarity index 95% rename from skyline/tracking/memory/activations.py rename to deepview_profile/tracking/memory/activations.py index 1c603ef..46dd5ed 100644 --- a/skyline/tracking/memory/activations.py +++ b/deepview_profile/tracking/memory/activations.py @@ -3,12 +3,12 @@ import torch -from skyline.tracking.backward_interceptor import BackwardInterceptor -from skyline.tracking.base import TrackerBase -from skyline.tracking.call_stack import CallStack -from skyline.tracking.callable_tracker import CallableTracker -from skyline.tracking.utils import remove_dunder -from skyline.user_code_utils import user_code_environment +from deepview_profile.tracking.backward_interceptor import BackwardInterceptor +from deepview_profile.tracking.base import TrackerBase +from deepview_profile.tracking.call_stack import CallStack +from deepview_profile.tracking.callable_tracker import CallableTracker +from deepview_profile.tracking.utils import remove_dunder +from deepview_profile.user_code_utils import user_code_environment OperationContext = collections.namedtuple( 'OperationContext', diff --git a/skyline/tracking/memory/report.py b/deepview_profile/tracking/memory/report.py similarity index 96% rename from skyline/tracking/memory/report.py rename to deepview_profile/tracking/memory/report.py index 60d7c02..fa99223 100644 --- a/skyline/tracking/memory/report.py +++ b/deepview_profile/tracking/memory/report.py @@ -2,8 +2,8 @@ import enum import os -from skyline.tracking.base import ReportBase, ReportBuilderBase -import skyline.tracking.memory.report_queries as queries +from deepview_profile.tracking.base import ReportBase, ReportBuilderBase +import deepview_profile.tracking.memory.report_queries as queries WeightEntry = collections.namedtuple( diff --git a/skyline/tracking/memory/report_queries.py b/deepview_profile/tracking/memory/report_queries.py similarity index 100% rename from skyline/tracking/memory/report_queries.py rename to deepview_profile/tracking/memory/report_queries.py diff --git a/skyline/tracking/memory/weights.py b/deepview_profile/tracking/memory/weights.py similarity index 87% rename from skyline/tracking/memory/weights.py rename to deepview_profile/tracking/memory/weights.py index acccc17..94e9512 100644 --- a/skyline/tracking/memory/weights.py +++ b/deepview_profile/tracking/memory/weights.py @@ -2,10 +2,10 @@ import inspect import weakref -from skyline.tracking.base import TrackerBase -from skyline.tracking.call_stack import CallStack -from skyline.tracking.hook_manager import HookManager -from skyline.tracking.utils import tensor_size_bytes +from deepview_profile.tracking.base import TrackerBase +from deepview_profile.tracking.call_stack import CallStack +from deepview_profile.tracking.hook_manager import HookManager +from deepview_profile.tracking.utils import tensor_size_bytes class WeightsTracker(TrackerBase): diff --git a/skyline/tracking/time/__init__.py b/deepview_profile/tracking/time/__init__.py similarity index 100% rename from skyline/tracking/time/__init__.py rename to deepview_profile/tracking/time/__init__.py diff --git a/skyline/tracking/time/operation.py b/deepview_profile/tracking/time/operation.py similarity index 88% rename from skyline/tracking/time/operation.py rename to deepview_profile/tracking/time/operation.py index 113524e..9bf54dc 100644 --- a/skyline/tracking/time/operation.py +++ b/deepview_profile/tracking/time/operation.py @@ -2,11 +2,11 @@ import torch -from skyline.tracking.call_stack import CallStack -from skyline.tracking.base import TrackerBase -from skyline.tracking.callable_tracker import CallableTracker -from skyline.tracking.utils import remove_dunder -from skyline.profiler.operation import OperationProfiler +from deepview_profile.tracking.call_stack import CallStack +from deepview_profile.tracking.base import TrackerBase +from deepview_profile.tracking.callable_tracker import CallableTracker +from deepview_profile.tracking.utils import remove_dunder +from deepview_profile.profiler.operation import OperationProfiler OperationInfo = collections.namedtuple( 'OperationInfo', ['operation_name', 'stack', 'forward_ms', 'backward_ms']) diff --git a/skyline/tracking/time/report.py b/deepview_profile/tracking/time/report.py similarity index 93% rename from skyline/tracking/time/report.py rename to deepview_profile/tracking/time/report.py index fe093f4..22363e4 100644 --- a/skyline/tracking/time/report.py +++ b/deepview_profile/tracking/time/report.py @@ -1,8 +1,8 @@ import collections import os -from skyline.tracking.base import ReportBase, ReportBuilderBase -import skyline.tracking.time.report_queries as queries +from deepview_profile.tracking.base import ReportBase, ReportBuilderBase +import deepview_profile.tracking.time.report_queries as queries RunTimeEntry = collections.namedtuple( 'RunTimeEntry', diff --git a/skyline/tracking/time/report_queries.py b/deepview_profile/tracking/time/report_queries.py similarity index 100% rename from skyline/tracking/time/report_queries.py rename to deepview_profile/tracking/time/report_queries.py diff --git a/skyline/tracking/tracker.py b/deepview_profile/tracking/tracker.py similarity index 90% rename from skyline/tracking/tracker.py rename to deepview_profile/tracking/tracker.py index 04cc260..aa347d2 100644 --- a/skyline/tracking/tracker.py +++ b/deepview_profile/tracking/tracker.py @@ -3,14 +3,14 @@ import torch -from skyline.tracking.backward_interceptor import BackwardInterceptor -from skyline.tracking.breakdown import HierarchicalBreakdownBuilder -from skyline.tracking.memory.activations import ActivationsTracker -from skyline.tracking.memory.report import MemoryReportBuilder, MiscSizeType -from skyline.tracking.memory.weights import WeightsTracker -from skyline.tracking.time.operation import OperationRunTimeTracker -from skyline.tracking.time.report import OperationRunTimeReportBuilder -from skyline.user_code_utils import user_code_environment +from deepview_profile.tracking.backward_interceptor import BackwardInterceptor +from deepview_profile.tracking.breakdown import HierarchicalBreakdownBuilder +from deepview_profile.tracking.memory.activations import ActivationsTracker +from deepview_profile.tracking.memory.report import MemoryReportBuilder, MiscSizeType +from deepview_profile.tracking.memory.weights import WeightsTracker +from deepview_profile.tracking.time.operation import OperationRunTimeTracker +from deepview_profile.tracking.time.report import OperationRunTimeReportBuilder +from deepview_profile.user_code_utils import user_code_environment logger = logging.getLogger(__name__) diff --git a/skyline/tracking/utils.py b/deepview_profile/tracking/utils.py similarity index 100% rename from skyline/tracking/utils.py rename to deepview_profile/tracking/utils.py diff --git a/skyline/user_code_utils.py b/deepview_profile/user_code_utils.py similarity index 91% rename from skyline/user_code_utils.py rename to deepview_profile/user_code_utils.py index ad5b674..245d351 100644 --- a/skyline/user_code_utils.py +++ b/deepview_profile/user_code_utils.py @@ -2,7 +2,7 @@ import os import sys -from skyline.exceptions import exceptions_as_analysis_errors +from deepview_profile.exceptions import exceptions_as_analysis_errors @contextlib.contextmanager @@ -36,10 +36,10 @@ def sys_path_root(script_root_path): # # For this to work, we need to ensure that sys.path[0] is the path to the # directory containing the entry_point.py file. However if we use exec(), - # sys.path[0] is set to the path of Skyline's command line executable. + # sys.path[0] is set to the path of DeepView's command line executable. # # To fix this problem, we set sys.path[0] to the correct root path before - # running the user's code and restore it to Skyline's script path after the + # running the user's code and restore it to DeepView's script path after the # execution completes. Doing this is **very important** as it ensures that # imports work as expected inside the user's code. This context manager # should be used each time we execute user code because imports can exist diff --git a/skyline/version_utils.py b/deepview_profile/version_utils.py similarity index 100% rename from skyline/version_utils.py rename to deepview_profile/version_utils.py diff --git a/examples/gnmt/README.md b/examples/gnmt/README.md index b346566..1dc2a5a 100644 --- a/examples/gnmt/README.md +++ b/examples/gnmt/README.md @@ -5,13 +5,13 @@ code found in the [MLPerf training repository](https://github.com/mlperf/trainin To launch an interactive DeepView.Profile session for GNMT, run ``` -skyline interactive entry_point.py +deepview interactive entry_point.py ``` ## License -This code, with the exception of the `skyline_` prefixed functions in +This code, with the exception of the `deepview_` prefixed functions in `entry_point.py`, was adapted from the MLPerf training benchmarks and therefore shares the same license. The unmodified license can be found in the `LICENSE` file in the `seq2seq` directory. diff --git a/protocol/Makefile b/protocol/Makefile index 9c53b9b..dc97cb8 100644 --- a/protocol/Makefile +++ b/protocol/Makefile @@ -3,7 +3,7 @@ GEN_DIR = protocol_gen PLUGIN_GEN = ../plugin/lib/$(GEN_DIR) PLUGIN_GEN_FILE = $(PLUGIN_GEN)/innpv_pb.js -SERVER_GEN = ../skyline/$(GEN_DIR) +SERVER_GEN = ../deepview_profile/$(GEN_DIR) SERVER_GEN_FILE = $(SERVER_GEN)/innpv_pb2.py PROTO_FILE = innpv.proto diff --git a/pyproject.toml b/pyproject.toml index 1af18d8..a11e9b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,8 @@ [tool.poetry] -name = "deepview-profiler" +name = "deepview-profile" version = "0.12.1" description = "Interactive performance profiling and debugging tool for PyTorch neural networks." -authors = ["Geoffrey Yu "] -maintainers = ["Akbar Nurlybayev ", "Yubo Gao "] +authors = ["CentML "] license = "Apache-2.0" readme = "README.md" repository = "https://github.com/CentML/DeepView.Profile" @@ -16,13 +15,13 @@ classifiers = [ "Topic :: Software Development :: Debuggers", ] packages = [ - { include = "skyline" }, + { include = "deepview_profile" }, ] include = [ "pyproject.toml" ] [tool.poetry.scripts] -deepview = "skyline.skyline:main" +deepview = "deepview_profile.deepview_profile:main" [tool.poetry.dependencies] python = "^3.7" @@ -33,6 +32,7 @@ torch = "*" nvidia-ml-py3 = "*" toml = "^0.10.2" pyRAPL = "^0.2.3" +deepview-predict = "*" [tool.poetry.dev-dependencies] diff --git a/test/TESTING.md b/test/TESTING.md index 01cc4fc..1b0ee8c 100644 --- a/test/TESTING.md +++ b/test/TESTING.md @@ -6,7 +6,7 @@ To run tests: $ pytest ============================= test session starts ============================== platform linux -- Python 3.9.13, pytest-7.1.3, pluggy-1.0.0 -rootdir: /home/ubuntu/habitat-a100/centml/skyline/test +rootdir: /home/ubuntu/habitat-a100/centml/deepview_profile/test collected 2 items test_driver.py .. [100%] diff --git a/test/config.json b/test/config.json index 66cab36..fc0d1cd 100644 --- a/test/config.json +++ b/test/config.json @@ -1,7 +1,7 @@ { - "skyline_bin": "/home/ubuntu/habitat-a100/centml/venv/bin/skyline", + "skyline_bin": "/home/ubuntu/habitat-a100/centml/venv/bin/deepview", "entry_points": [ - "/home/ubuntu/habitat-a100/centml/skyline/examples/resnet/entry_point.py", - "/home/ubuntu/habitat-a100/centml/skyline/examples/testnet/entry_point.py" + "/home/ubuntu/habitat-a100/centml/deepview_profile/examples/resnet/entry_point.py", + "/home/ubuntu/habitat-a100/centml/deepview_profile/examples/testnet/entry_point.py" ] } diff --git a/test/test_database.py b/test/test_database.py index 45df087..e95079c 100644 --- a/test/test_database.py +++ b/test/test_database.py @@ -1,6 +1,6 @@ import os import random -import skyline.db.database as database +import deepview_profile.db.database as database class MockDatabaseInterface(database.DatabaseInterface): def __del__(self): diff --git a/test/utils.py b/test/utils.py index 3a95ad9..55ebc69 100644 --- a/test/utils.py +++ b/test/utils.py @@ -4,7 +4,7 @@ import subprocess import threading -from skyline.protocol_gen import innpv_pb2 +from deepview_profile.protocol_gen import innpv_pb2 def stream_monitor(stream, callback=None): try: @@ -35,11 +35,11 @@ def on_message_stdout(self, message): def on_message_stderr(self, message): message = message.decode("ascii").rstrip() print("stderr", message) - if "Skyline interactive profiling session started!" in message: + if "DeepView interactive profiling session started!" in message: self.state = 1 def spawn_process(self): - # Skyline expects the entry_point filename to be relative + # DeepView expects the entry_point filename to be relative working_dir = os.path.dirname(self.entry_point) entry_filename = os.path.basename(self.entry_point) launch_command = [self.skyline_bin, "interactive", entry_filename] diff --git a/tools/common.sh b/tools/common.sh index e90f0c5..408351f 100644 --- a/tools/common.sh +++ b/tools/common.sh @@ -84,7 +84,7 @@ function check_tools() { function build_release() { echo_yellow "> Building wheels..." rm -rf ../dist/* - cp ../pyproject.toml ../skyline/ + cp ../pyproject.toml ../deepview_profile/ poetry build echo_green "✓ Wheels successfully built" } diff --git a/tools/prepare-release.sh b/tools/prepare-release.sh index 0af95c2..851d317 100755 --- a/tools/prepare-release.sh +++ b/tools/prepare-release.sh @@ -1,6 +1,6 @@ #!/bin/bash -# This script is used to release a new version of the Skyline CLI. +# This script is used to release a new version of the DeepView CLI. # Release steps: # 1. Create release branch # 2. Increment package version in pyproject.toml @@ -17,7 +17,7 @@ cd $RELEASE_SCRIPT_PATH source common.sh echo "" -echo_blue "Skyline Profiler Release Preparation Tool" +echo_blue "DeepView.Profile Release Preparation Tool" echo_blue "=========================================" echo ""