diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index ff17fa5a..1b4121ae 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -1,4 +1,4 @@ -name: Unit, integration, and notebook tests +name: Unit, integration, and notebook tests (Py39) on: [push] # branches: [ "disabled" ] @@ -10,10 +10,10 @@ jobs: if: "!contains(github.event.head_commit.message, 'CI Bot')" steps: - uses: actions/checkout@v3 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v3 with: - python-version: "3.8" + python-version: "3.9" - name: Check python version run: python --version - name: Install our dependencies @@ -28,6 +28,8 @@ jobs: pytest --ignore=tests/decorator_tests/ml_tests/llm_tests - name: Test notebooks run: | + pip install -e . python flowcept/flowcept_webserver/app.py & sleep 3 + export FLOWCEPT_SETTINGS_PATH=~/.flowcept/settings.yaml pytest --nbmake "notebooks/" --nbmake-timeout=600 --ignore=notebooks/dask_from_CLI.ipynb diff --git a/.github/workflows/test-python-310-macos.yml b/.github/workflows/test-python-310-macos.yml index f251342c..340c198a 100644 --- a/.github/workflows/test-python-310-macos.yml +++ b/.github/workflows/test-python-310-macos.yml @@ -1,7 +1,8 @@ name: Test Python 3.10 - MacOS on: pull_request: - branches: [ "dev", "main" ] + branches: [ "disabled" ] #[ "dev", "main" ] + types: [opened, synchronize, reopened] jobs: build: runs-on: macos-latest @@ -24,10 +25,13 @@ jobs: pip install -r extra_requirements/dev-requirements.txt - name: Install docker run: | - brew install docker docker-compose + brew install docker docker-compose + brew install colima colima start mkdir -p ~/.docker/cli-plugins - ln -sfn /usr/local/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose + echo $HOMEBREW_PREFIX + ln -sfn $HOMEBREW_PREFIX/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose + #ln -sfn /usr/local/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose - name: Run Docker Compose run: | docker compose version @@ -39,4 +43,5 @@ jobs: run: | python flowcept/flowcept_webserver/app.py & sleep 3 + export FLOWCEPT_SETTINGS_PATH=~/.flowcept/settings.yaml pytest --nbmake "notebooks/" --nbmake-timeout=600 --ignore=notebooks/dask_from_CLI.ipynb diff --git a/.github/workflows/test-python-310.yml b/.github/workflows/test-python-310.yml index 8f4990ae..4b989c88 100644 --- a/.github/workflows/test-python-310.yml +++ b/.github/workflows/test-python-310.yml @@ -2,6 +2,7 @@ name: Test Python 3.10 on: pull_request: branches: [ "dev", "main" ] + types: [opened, synchronize, reopened] # branches: [ "disabled" ] jobs: @@ -10,8 +11,6 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 if: "!contains(github.event.head_commit.message, 'CI Bot')" -# env: -# FLOWCEPT_SETTINGS_PATH: 'resources/settings.yaml' steps: - uses: actions/checkout@v3 - name: Set up Python 3.10 @@ -29,9 +28,11 @@ jobs: run: docker compose -f deployment/compose.yml up -d - name: Test with pytest run: | - pytest --ignore=tests/decorator_tests/ml_tests/llm_tests/ + pytest --ignore=tests/decorator_tests/ml_tests/llm_tests - name: Test notebooks run: | + pip install -e . python flowcept/flowcept_webserver/app.py & sleep 3 + export FLOWCEPT_SETTINGS_PATH=~/.flowcept/settings.yaml pytest --nbmake "notebooks/" --nbmake-timeout=600 --ignore=notebooks/dask_from_CLI.ipynb diff --git a/.github/workflows/test-python-311.yml b/.github/workflows/test-python-311.yml index b3d81476..a83415ee 100644 --- a/.github/workflows/test-python-311.yml +++ b/.github/workflows/test-python-311.yml @@ -36,4 +36,5 @@ jobs: run: | python flowcept/flowcept_webserver/app.py & sleep 3 + export FLOWCEPT_SETTINGS_PATH=~/.flowcept/settings.yaml pytest --nbmake "notebooks/" --ignore=notebooks/dask_from_CLI.ipynb diff --git a/.github/workflows/test-python-39.yml b/.github/workflows/test-python-39.yml deleted file mode 100644 index e15b944c..00000000 --- a/.github/workflows/test-python-39.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Test Python 3.9 -on: - pull_request: - branches: [ "dev", "main" ] - # branches: [ "disabled" ] - -jobs: - - build: - runs-on: ubuntu-latest - timeout-minutes: 60 - if: "!contains(github.event.head_commit.message, 'CI Bot')" -# env: -# FLOWCEPT_SETTINGS_PATH: 'resources/settings.yaml' - steps: - - uses: actions/checkout@v3 - - name: Set up Python 3.9 - uses: actions/setup-python@v3 - with: - python-version: "3.9" - - name: Check python version - run: python --version - - name: Install our dependencies - run: | - python -m pip install --upgrade pip - pip install -e .[full] - pip install -r extra_requirements/dev-requirements.txt - - name: Run Docker Compose - run: docker compose -f deployment/compose.yml up -d - - name: Test with pytest - run: | - pytest --ignore=tests/decorator_tests/ml_tests/llm_tests/ - - name: Test notebooks - run: | - python flowcept/flowcept_webserver/app.py & - sleep 3 - pytest --nbmake "notebooks/" --nbmake-timeout=600 --ignore=notebooks/dask_from_CLI.ipynb diff --git a/.gitignore b/.gitignore index b95300a1..78fde49f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ notebooks/tb_* notebooks/scheduler_file.json test.py **/*dump* +time.txt +tmp/ diff --git a/README.md b/README.md index 0450ab2d..98feccb1 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ plugin: And other variables depending on the Plugin. For instance, in Dask, timestamp creation by workers add interception overhead. +## Install AMD GPU Lib + +https://rocm.docs.amd.com/projects/amdsmi/en/latest/ + ## See also - [Zambeze Repository](https://github.com/ORNL/zambeze) diff --git a/deployment/compose.yml b/deployment/compose.yml index 7bf3a6ff..abd7dbdc 100644 --- a/deployment/compose.yml +++ b/deployment/compose.yml @@ -10,21 +10,23 @@ services: flowcept_mongo: container_name: flowcept_mongo image: mongo:latest + # volumes: + # - /Users/rsr/Downloads/mongo_data/db:/data/db ports: - 27017:27017 - # This is just for the cases where one does not want to use the same Redis instance for caching and messaging, but - # it's not required to have separate instances. -# local_interceptor_cache: -# container_name: local_interceptor_cache -# image: redis -# ports: -# - 60379:6379 +# # This is just for the cases where one does not want to use the same Redis instance for caching and messaging, but +# # it's not required to have separate instances. +# # local_interceptor_cache: +# # container_name: local_interceptor_cache +# # image: redis +# # ports: +# # - 60379:6379 zambeze_rabbitmq: - container_name: zambeze_rabbitmq - image: rabbitmq:3.11-management - ports: - - 5672:5672 - - 15672:15672 + container_name: zambeze_rabbitmq + image: rabbitmq:3.11-management + ports: + - 5672:5672 + - 15672:15672 diff --git a/extra_requirements/amd-requirements.txt b/extra_requirements/amd-requirements.txt index db5916cb..e69de29b 100644 --- a/extra_requirements/amd-requirements.txt +++ b/extra_requirements/amd-requirements.txt @@ -1 +0,0 @@ -pyamdgpuinfo==2.1.6 diff --git a/extra_requirements/dask-requirements.txt b/extra_requirements/dask-requirements.txt index adb52370..8f8a8a10 100644 --- a/extra_requirements/dask-requirements.txt +++ b/extra_requirements/dask-requirements.txt @@ -1,5 +1,5 @@ tomli==1.1.0 -dask[distributed]==2022.12.0 +dask[distributed]==2023.11.0 #dask[distributed]==2023.5.0 diff --git a/extra_requirements/dev-requirements.txt b/extra_requirements/dev-requirements.txt index 6b2db7f5..686230fa 100644 --- a/extra_requirements/dev-requirements.txt +++ b/extra_requirements/dev-requirements.txt @@ -11,3 +11,5 @@ torch torchvision datasets torchtext +sacremoses +nltk diff --git a/extra_requirements/responsible_ai-requirements.txt b/extra_requirements/responsible_ai-requirements.txt index bd56efef..9fa1df3f 100644 --- a/extra_requirements/responsible_ai-requirements.txt +++ b/extra_requirements/responsible_ai-requirements.txt @@ -1,2 +1,2 @@ -shap==0.42.1 +#shap==0.42.1 torch diff --git a/flowcept/__init__.py b/flowcept/__init__.py index aea5b0f5..94368532 100644 --- a/flowcept/__init__.py +++ b/flowcept/__init__.py @@ -12,13 +12,14 @@ WorkflowObject, ) -try: - from flowcept.instrumentation.decorators.responsible_ai import ( - model_explainer, - model_profiler, - ) -except: - pass +# These resp_ai imports below are adding long wait in flowcept imports! +# try: +# from flowcept.instrumentation.decorators.responsible_ai import ( +# #model_explainer, +# #model_profiler, +# ) +# except: +# pass if Vocabulary.Settings.ZAMBEZE_KIND in flowcept.configs.ADAPTERS: try: diff --git a/flowcept/analytics/__init__.py b/flowcept/analytics/__init__.py index 93130ff2..6bf2c5a6 100644 --- a/flowcept/analytics/__init__.py +++ b/flowcept/analytics/__init__.py @@ -8,5 +8,3 @@ describe_col, describe_cols, ) - -from flowcept.analytics.plot import heatmap, scatter2d_with_colors diff --git a/flowcept/commons/daos/autoflush_buffer.py b/flowcept/commons/daos/autoflush_buffer.py new file mode 100644 index 00000000..7f7774b2 --- /dev/null +++ b/flowcept/commons/daos/autoflush_buffer.py @@ -0,0 +1,97 @@ +from queue import Queue +from typing import Union, List, Dict, Callable + +import msgpack +from redis import Redis +from redis.client import PubSub +from threading import Thread, Lock, Event +from time import time, sleep + +import flowcept.commons +from flowcept.commons.daos.keyvalue_dao import KeyValueDAO +from flowcept.commons.utils import perf_log +from flowcept.commons.flowcept_logger import FlowceptLogger +from flowcept.configs import ( + REDIS_HOST, + REDIS_PORT, + REDIS_CHANNEL, + REDIS_PASSWORD, + JSON_SERIALIZER, + REDIS_BUFFER_SIZE, + REDIS_INSERTION_BUFFER_TIME, + PERF_LOG, + REDIS_URI, +) + +from flowcept.commons.utils import GenericJSONEncoder + + +class AutoflushBuffer: + def __init__( + self, + max_size, + flush_interval, + flush_function: Callable, + *flush_function_args, + **flush_function_kwargs, + ): + self.logger = FlowceptLogger() + self._max_size = max_size + self._flush_interval = flush_interval + self._buffers = [[], []] + self._current_buffer_index = 0 + self._swap_event = Event() + self._stop_event = Event() + + self._timer_thread = Thread(target=self.time_based_flush) + self._timer_thread.start() + + self._flush_thread = Thread(target=self._flush_buffers) + self._flush_thread.start() + + self._flush_function = flush_function + self._flush_function_args = flush_function_args + self._flush_function_kwargs = flush_function_kwargs + + def append(self, item): + # if self.stop_event.is_set(): + # return + buffer = self._buffers[self._current_buffer_index] + buffer.append(item) + if len(buffer) >= self._max_size: + self._swap_event.set() + + def time_based_flush(self): + while not self._stop_event.is_set(): + self._swap_event.wait(self._flush_interval) + if not self._stop_event.is_set(): + self._swap_event.set() + + def _do_flush(self): + old_buffer_index = self._current_buffer_index + self._current_buffer_index = 1 - self._current_buffer_index + old_buffer = self._buffers[old_buffer_index] + if old_buffer: + self._flush_function( + old_buffer[:], + *self._flush_function_args, + **self._flush_function_kwargs, + ) + self._buffers[old_buffer_index] = [] + + def _flush_buffers(self): + while not self._stop_event.is_set() or any(self._buffers): + self._swap_event.wait() + self._swap_event.clear() + + self._do_flush() + + if self._stop_event.is_set(): + break + + def stop(self): + self._stop_event.set() + self._swap_event.set() + self._flush_thread.join() + self._timer_thread.join() + self._do_flush() diff --git a/flowcept/commons/daos/document_db_dao.py b/flowcept/commons/daos/document_db_dao.py index 3e3e5ed5..25718e37 100644 --- a/flowcept/commons/daos/document_db_dao.py +++ b/flowcept/commons/daos/document_db_dao.py @@ -1,8 +1,12 @@ from typing import List, Dict, Tuple, Any import io import json +from uuid import uuid4 + +import pickle import zipfile +import pymongo from bson import ObjectId from bson.json_util import dumps from pymongo import MongoClient, UpdateOne @@ -22,6 +26,7 @@ MONGO_WORKFLOWS_COLLECTION, PERF_LOG, MONGO_URI, + MONGO_CREATE_INDEX, ) from flowcept.flowceptor.consumers.consumer_utils import ( curate_dict_task_messages, @@ -31,7 +36,7 @@ @singleton class DocumentDBDao(object): - def __init__(self): + def __init__(self, create_index=MONGO_CREATE_INDEX): self.logger = FlowceptLogger() if MONGO_URI is not None: @@ -42,8 +47,10 @@ def __init__(self): self._tasks_collection = self._db[MONGO_TASK_COLLECTION] self._wfs_collection = self._db[MONGO_WORKFLOWS_COLLECTION] + self._obj_collection = self._db["objects"] - self._create_indices() + if create_index: + self._create_indices() def _create_indices(self): # Creating task collection indices: @@ -52,7 +59,9 @@ def _create_indices(self): for x in self._tasks_collection.list_indexes() ] if not TaskObject.task_id_field() in existing_indices: - self._tasks_collection.create_index(TaskObject.task_id_field()) + self._tasks_collection.create_index( + TaskObject.task_id_field(), unique=True + ) if not TaskObject.workflow_id_field() in existing_indices: self._tasks_collection.create_index( TaskObject.workflow_id_field() @@ -63,8 +72,28 @@ def _create_indices(self): list(x["key"].keys())[0] for x in self._wfs_collection.list_indexes() ] - if not TaskObject.workflow_id_field() in existing_indices: - self._wfs_collection.create_index(TaskObject.task_id_field()) + if not WorkflowObject.workflow_id_field() in existing_indices: + self._wfs_collection.create_index( + WorkflowObject.workflow_id_field(), unique=True + ) + + # Creating objects collection indices: + existing_indices = [ + list(x["key"].keys())[0] + for x in self._obj_collection.list_indexes() + ] + + if not "object_id" in existing_indices: + self._obj_collection.create_index("object_id", unique=True) + + if not WorkflowObject.workflow_id_field() in existing_indices: + self._obj_collection.create_index( + WorkflowObject.workflow_id_field(), unique=False + ) + if not TaskObject.task_id_field() in existing_indices: + self._obj_collection.create_index( + TaskObject.task_id_field(), unique=False + ) def task_query( self, @@ -413,3 +442,49 @@ def dump_to_file( except Exception as e: self.logger.exception(e) return + + def liveness_test(self) -> bool: + try: + self._db.list_collection_names() + return True + except ConnectionError as e: + self.logger.exception(e) + return False + except Exception as e: + self.logger.exception(e) + return False + + def save_object( + self, + object, + object_id=None, + task_id=None, + workflow_id=None, + type=None, + custom_metadata=None, + pickle_=False, + ): + if object_id is None: + object_id = str(uuid4()) + obj_doc = {"object_id": object_id} + blob = object + if pickle_: + blob = pickle.dumps(object) + obj_doc["pickle"] = True + obj_doc["data"] = blob + if task_id is not None: + obj_doc["task_id"] = task_id + if workflow_id is not None: + obj_doc["workflow_id"] = workflow_id + if type is not None: + obj_doc["type"] = type + if custom_metadata is not None: + obj_doc["custom_metadata"] = custom_metadata + + self._obj_collection.insert_one(obj_doc) + + return object_id + + def get_objects(self, filter): + documents = self._obj_collection.find(filter) + return list(documents) diff --git a/flowcept/commons/daos/keyvalue_dao.py b/flowcept/commons/daos/keyvalue_dao.py index d978854b..0871b65f 100644 --- a/flowcept/commons/daos/keyvalue_dao.py +++ b/flowcept/commons/daos/keyvalue_dao.py @@ -30,7 +30,9 @@ def add_key_into_set(self, set_name: str, key): self._redis.sadd(set_name, key) def remove_key_from_set(self, set_name: str, key): + self.logger.info(f"Removing key {key} from set: {set_name}") self._redis.srem(set_name, key) + self.logger.info(f"Removed key {key} from set: {set_name}") def set_has_key(self, set_name: str, key) -> bool: return self._redis.sismember(set_name, key) @@ -39,7 +41,9 @@ def set_count(self, set_name: str): return self._redis.scard(set_name) def set_is_empty(self, set_name: str) -> bool: - return self.set_count(set_name) == 0 + _count = self.set_count(set_name) + self.logger.info(f"Set {set_name} has {_count}") + return _count == 0 def delete_all_matching_sets(self, key_pattern): matching_sets = self._redis.keys(key_pattern) diff --git a/flowcept/commons/daos/mq_dao.py b/flowcept/commons/daos/mq_dao.py index 71b4e04b..8b9c25fb 100644 --- a/flowcept/commons/daos/mq_dao.py +++ b/flowcept/commons/daos/mq_dao.py @@ -1,11 +1,20 @@ -import json +import concurrent +import concurrent.futures +from functools import partial +from multiprocessing import Pool, cpu_count +from queue import Queue +from typing import Union, List, Dict, Callable + +import msgpack from redis import Redis from redis.client import PubSub -from threading import Thread, Lock -from time import time, sleep +from time import time + +import flowcept.commons +from flowcept.commons.daos.autoflush_buffer import AutoflushBuffer from flowcept.commons.daos.keyvalue_dao import KeyValueDAO -from flowcept.commons.utils import perf_log +from flowcept.commons.utils import perf_log, chunked from flowcept.commons.flowcept_logger import FlowceptLogger from flowcept.configs import ( REDIS_HOST, @@ -15,8 +24,11 @@ JSON_SERIALIZER, REDIS_BUFFER_SIZE, REDIS_INSERTION_BUFFER_TIME, + REDIS_CHUNK_SIZE, PERF_LOG, REDIS_URI, + ENRICH_MESSAGES, + DB_FLUSH_MODE, ) from flowcept.commons.utils import GenericJSONEncoder @@ -38,7 +50,46 @@ def _get_set_name(exec_bundle_id=None): set_id += "_" + str(exec_bundle_id) return set_id - def __init__(self): + @staticmethod + def pipe_publish( + buffer, redis_connection, logger=flowcept.commons.logger + ): + pipe = redis_connection.pipeline() + logger.info(f"Going to flush {len(buffer)} to MQ...") + for message in buffer: + try: + logger.debug( + f"Going to send Message:" + f"\n\t[BEGIN_MSG]{message}\n[END_MSG]\t" + ) + pipe.publish(REDIS_CHANNEL, msgpack.dumps(message)) + except Exception as e: + logger.exception(e) + logger.error( + "Some messages couldn't be flushed! Check the messages' contents!" + ) + logger.error(f"Message that caused error: {message}") + t0 = 0 + if PERF_LOG: + t0 = time() + try: + pipe.execute() + logger.info(f"Flushed {len(buffer)} msgs to MQ!") + except Exception as e: + logger.exception(e) + perf_log("mq_pipe_execute", t0) + + @staticmethod + def bulk_publish( + buffer, redis_connection, logger=flowcept.commons.logger + ): + if REDIS_CHUNK_SIZE > 1: + for chunk in chunked(buffer, REDIS_CHUNK_SIZE): + MQDao.pipe_publish(chunk, redis_connection, logger) + else: + MQDao.pipe_publish(buffer, redis_connection, logger) + + def __init__(self, mq_host=None, mq_port=None, adapter_settings=None): self.logger = FlowceptLogger() if REDIS_URI is not None: @@ -47,25 +98,22 @@ def __init__(self): else: # Otherwise, use the host, port, and password settings self._redis = Redis( - host=REDIS_HOST, - port=REDIS_PORT, + host=REDIS_HOST if mq_host is None else mq_host, + port=REDIS_PORT if mq_port is None else mq_port, db=0, password=REDIS_PASSWORD if REDIS_PASSWORD else None, ) - + self._adapter_settings = adapter_settings self._keyvalue_dao = KeyValueDAO(connection=self._redis) - self._buffer = None - self._time_thread: Thread = None - self._previous_time = -1 - self._stop_flag = False + self._time_based_flushing_started = False - self._lock = None + self.buffer: Union[AutoflushBuffer, List] = None def register_time_based_thread_init( self, interceptor_instance_id: str, exec_bundle_id=None ): set_name = MQDao._get_set_name(exec_bundle_id) - self.logger.debug( + self.logger.info( f"Registering the beginning of the time_based MQ flush thread {set_name}.{interceptor_instance_id}" ) self._keyvalue_dao.add_key_into_set(set_name, interceptor_instance_id) @@ -74,105 +122,76 @@ def register_time_based_thread_end( self, interceptor_instance_id: str, exec_bundle_id=None ): set_name = MQDao._get_set_name(exec_bundle_id) - self.logger.debug( + self.logger.info( f"Registering the end of the time_based MQ flush thread {set_name}.{interceptor_instance_id}" ) self._keyvalue_dao.remove_key_from_set( set_name, interceptor_instance_id ) + self.logger.info( + f"Done registering the end of the time_based MQ flush thread {set_name}.{interceptor_instance_id}" + ) def all_time_based_threads_ended(self, exec_bundle_id=None): set_name = MQDao._get_set_name(exec_bundle_id) return self._keyvalue_dao.set_is_empty(set_name) - def delete_all_time_based_threads_sets(self): - return self._keyvalue_dao.delete_all_matching_sets( - MQDao._get_set_name() + "*" - ) + # def delete_all_time_based_threads_sets(self): + # return self._keyvalue_dao.delete_all_matching_sets( + # MQFlusher._get_set_name() + "*" + # ) - def start_time_based_flushing( - self, interceptor_instance_id: str, exec_bundle_id=None - ): - self._buffer = list() - self._time_thread: Thread = None - self._previous_time = time() - self._stop_flag = False - self._time_based_flushing_started = False - self._lock = Lock() - self._time_thread = Thread(target=self.time_based_flushing) - self.register_time_based_thread_init( - interceptor_instance_id, exec_bundle_id - ) - self._time_based_flushing_started = True - self._time_thread.start() - - def stop_time_based_flushing( - self, interceptor_instance_id: str, exec_bundle_id: int = None - ): - self.logger.info("MQ time-based received stop signal!") - if self._time_based_flushing_started: - self._stop_flag = True - self._time_thread.join() - self._flush() - self._send_stop_message(interceptor_instance_id, exec_bundle_id) - self._time_based_flushing_started = False - self.logger.info("MQ time-based flushing stopped.") + def init_buffer(self, interceptor_instance_id: str, exec_bundle_id=None): + if flowcept.configs.DB_FLUSH_MODE == "online": + self.logger.info( + f"Starting MQ time-based flushing! bundle: {exec_bundle_id}; interceptor id: {interceptor_instance_id}" + ) + self.buffer = AutoflushBuffer( + max_size=REDIS_BUFFER_SIZE, + flush_interval=REDIS_INSERTION_BUFFER_TIME, + flush_function=MQDao.bulk_publish, + redis_connection=self._redis, + ) + # + self.register_time_based_thread_init( + interceptor_instance_id, exec_bundle_id + ) + self._time_based_flushing_started = True else: - self.logger.warning("MQ time-based flushing is not started") - - def _flush(self): - with self._lock: - if len(self._buffer): - pipe = self._redis.pipeline() - for message in self._buffer: - try: - pipe.publish( - REDIS_CHANNEL, - json.dumps(message, cls=MQDao.ENCODER), - ) - except Exception as e: - self.logger.error( - "Critical error as some messages couldn't be flushed! Check the messages' contents!" - ) - self.logger.exception(e) - t0 = 0 - if PERF_LOG: - t0 = time() - pipe.execute() - perf_log("mq_pipe_execute", t0) - self.logger.debug( - f"Flushed {len(self._buffer)} msgs to Redis!" - ) - self._buffer = list() + self.buffer = list() + + def _close_buffer(self): + if flowcept.configs.DB_FLUSH_MODE == "online": + if self._time_based_flushing_started: + self.buffer.stop() + self._time_based_flushing_started = False + else: + self.logger.error("MQ time-based flushing is not started") + else: + MQDao.bulk_publish(self.buffer, self._redis) + self.buffer = list() def subscribe(self) -> PubSub: pubsub = self._redis.pubsub() pubsub.psubscribe(REDIS_CHANNEL) return pubsub - def publish(self, message: dict): - self._buffer.append(message) - if len(self._buffer) >= REDIS_BUFFER_SIZE: - self.logger.debug("Redis buffer exceeded, flushing...") - self._flush() - - def time_based_flushing(self): - while not self._stop_flag: - if len(self._buffer): - now = time() - timediff = now - self._previous_time - if timediff >= REDIS_INSERTION_BUFFER_TIME: - self.logger.debug("Time to flush to redis!") - self._previous_time = now - self._flush() - self.logger.debug( - f"Time-based Redis inserter going to wait for {REDIS_INSERTION_BUFFER_TIME} s." - ) - sleep(REDIS_INSERTION_BUFFER_TIME) + def stop(self, interceptor_instance_id: str, bundle_exec_id: int = None): + self.logger.info( + f"MQ publisher received stop signal! bundle: {bundle_exec_id}; interceptor id: {interceptor_instance_id}" + ) + self._close_buffer() + self.logger.info( + f"Flushed MQ for the last time! Now going to send stop msg. bundle: {bundle_exec_id}; interceptor id: {interceptor_instance_id}" + ) + self.send_mq_dao_time_thread_stop( + interceptor_instance_id, bundle_exec_id + ) - def _send_stop_message( + def send_mq_dao_time_thread_stop( self, interceptor_instance_id, exec_bundle_id=None ): + # These control_messages are handled by the document inserter # TODO: these should be constants msg = { "type": "flowcept_control", @@ -180,8 +199,24 @@ def _send_stop_message( "interceptor_instance_id": interceptor_instance_id, "exec_bundle_id": exec_bundle_id, } - self._redis.publish(REDIS_CHANNEL, json.dumps(msg)) + self.logger.info("Control msg sent: " + str(msg)) + self._redis.publish(REDIS_CHANNEL, msgpack.dumps(msg)) - def stop_document_inserter(self): + def send_document_inserter_stop(self): + # These control_messages are handled by the document inserter msg = {"type": "flowcept_control", "info": "stop_document_inserter"} - self._redis.publish(REDIS_CHANNEL, json.dumps(msg)) + self._redis.publish(REDIS_CHANNEL, msgpack.dumps(msg)) + + def liveness_test(self): + try: + response = self._redis.ping() + if response: + return True + else: + return False + except ConnectionError as e: + self.logger.exception(e) + return False + except Exception as e: + self.logger.exception(e) + return False diff --git a/flowcept/commons/flowcept_dataclasses/task_object.py b/flowcept/commons/flowcept_dataclasses/task_object.py index 92c6471f..13a1f35f 100644 --- a/flowcept/commons/flowcept_dataclasses/task_object.py +++ b/flowcept/commons/flowcept_dataclasses/task_object.py @@ -1,7 +1,17 @@ from enum import Enum from typing import Dict, AnyStr, Any, Union, List +import msgpack +import flowcept from flowcept.commons.flowcept_dataclasses.telemetry import Telemetry +from flowcept.configs import ( + HOSTNAME, + PRIVATE_IP, + PUBLIC_IP, + LOGIN_NAME, + NODE_NAME, + CAMPAIGN_ID, +) class Status(str, Enum): # inheriting from str here for JSON serialization @@ -17,9 +27,8 @@ def get_finished_statuses(): return [Status.FINISHED, Status.ERROR] -# Not a dataclass because a dataclass stores keys even when there's no value, -# adding unnecessary overhead. class TaskObject: + type = "task" task_id: AnyStr = None # Any way to identify a task utc_timestamp: float = None adapter_id: AnyStr = None @@ -30,6 +39,7 @@ class TaskObject: submitted_at: float = None started_at: float = None ended_at: float = None + registered_at: float = None telemetry_at_start: Telemetry = None telemetry_at_end: Telemetry = None workflow_name: AnyStr = None @@ -39,18 +49,26 @@ class TaskObject: stdout: Union[AnyStr, Dict] = None stderr: Union[AnyStr, Dict] = None custom_metadata: Dict[AnyStr, Any] = None + mq_host: str = None environment_id: AnyStr = None node_name: AnyStr = None login_name: AnyStr = None public_ip: AnyStr = None private_ip: AnyStr = None hostname: AnyStr = None - extra_metadata: Dict = None - sys_name: AnyStr = None address: AnyStr = None dependencies: List = None dependents: List = None - flowcept_version: str = None + + @staticmethod + def get_time_field_names(): + return [ + "started_at", + "ended_at", + "submitted_at", + "registered_at", + "utc_timestamp", + ] @staticmethod def get_dict_field_names(): @@ -70,10 +88,54 @@ def task_id_field(): def workflow_id_field(): return "workflow_id" + def enrich(self, adapter_key=None): + if adapter_key is not None: + # TODO :base-interceptor-refactor: :code-reorg: :usability: revisit all times we assume settings is not none + self.adapter_id = adapter_key + + if self.utc_timestamp is None: + self.utc_timestamp = flowcept.commons.utils.get_utc_now() + + if self.campaign_id is None: + self.campaign_id = CAMPAIGN_ID + + if self.node_name is None and NODE_NAME is not None: + self.node_name = NODE_NAME + + if self.login_name is None and LOGIN_NAME is not None: + self.login_name = LOGIN_NAME + + if self.public_ip is None and PUBLIC_IP is not None: + self.public_ip = PUBLIC_IP + + if self.private_ip is None and PRIVATE_IP is not None: + self.private_ip = PRIVATE_IP + + if self.hostname is None and HOSTNAME is not None: + self.hostname = HOSTNAME + def to_dict(self): - ret = self.__dict__ - if self.telemetry_at_start is not None: - ret["telemetry_at_start"] = self.telemetry_at_start.to_dict() - if self.telemetry_at_end is not None: - ret["telemetry_at_end"] = self.telemetry_at_end.to_dict() - return ret + result_dict = {} + for attr, value in self.__dict__.items(): + if value is not None: + if attr == "telemetry_at_start": + result_dict[attr] = self.telemetry_at_start.to_dict() + elif attr == "telemetry_at_end": + result_dict[attr] = self.telemetry_at_end.to_dict() + elif attr == "status": + result_dict[attr] = value.value + else: + result_dict[attr] = value + result_dict["type"] = "task" + return result_dict + + def serialize(self): + return msgpack.dumps(self.to_dict()) + + # @staticmethod + # def deserialize(serialized_data) -> 'TaskObject': + # dict_obj = msgpack.loads(serialized_data) + # obj = TaskObject() + # for k, v in dict_obj.items(): + # setattr(obj, k, v) + # return obj diff --git a/flowcept/commons/flowcept_dataclasses/workflow_object.py b/flowcept/commons/flowcept_dataclasses/workflow_object.py index 52a80d7c..2dc23995 100644 --- a/flowcept/commons/flowcept_dataclasses/workflow_object.py +++ b/flowcept/commons/flowcept_dataclasses/workflow_object.py @@ -1,49 +1,105 @@ from typing import Dict, AnyStr, List +import msgpack +from omegaconf import OmegaConf + +import flowcept +from flowcept import __version__ + +from flowcept.configs import ( + settings, + FLOWCEPT_USER, + SYS_NAME, + CAMPAIGN_ID, + EXTRA_METADATA, + ENVIRONMENT_ID, +) # Not a dataclass because a dataclass stores keys even when there's no value, # adding unnecessary overhead. class WorkflowObject: + workflow_id: AnyStr = None + parent_workflow_id: AnyStr = None + machine_info: Dict = None + flowcept_settings: Dict = None + flowcept_version: AnyStr = None + utc_timestamp: float = None + user: AnyStr = None + campaign_id: AnyStr = None + adapter_id: AnyStr = None + interceptor_ids: List[AnyStr] = None + name: AnyStr = None + custom_metadata: Dict = None + environment_id: str = None + sys_name: str = None + extra_metadata: str = None + # parent_task_id: str = None + used: Dict = None + generated: Dict = None + def __init__( - self, - workflow_id: AnyStr = None, - parent_workflow_id: AnyStr = None, - machine_info: Dict = None, - flowcept_settings: Dict = None, - flowcept_version: AnyStr = None, - utc_timestamp: float = None, - user: AnyStr = None, - campaign_id: AnyStr = None, - adapter_id: AnyStr = None, - interceptor_ids: List[AnyStr] = None, - name: AnyStr = None, - custom_metadata: Dict = None, + self, workflow_id=None, name=None, used=None, generated=None ): self.workflow_id = workflow_id - self.parent_workflow_id = parent_workflow_id - self.machine_info = machine_info - self.flowcept_settings = flowcept_settings - self.flowcept_version = flowcept_version - self.utc_timestamp = utc_timestamp - self.user = user - self.campaign_id = campaign_id - self.adapter_id = adapter_id - self.interceptor_ids = interceptor_ids self.name = name - self.custom_metadata = custom_metadata + self.used = used + self.generated = generated @staticmethod def workflow_id_field(): return "workflow_id" + @staticmethod + def from_dict(dict_obj: Dict) -> "WorkflowObject": + wf_obj = WorkflowObject() + for k, v in dict_obj.items(): + setattr(wf_obj, k, v) + return wf_obj + def to_dict(self): - ret = self.__dict__ - # I'm just leaving these comments below in case we need to add specific to_dict stuff - # if self.telemetry_at_start is not None: - # ret["telemetry_at_start"] = self.telemetry_at_start.to_dict() - # if self.telemetry_at_end is not None: - # ret["telemetry_at_end"] = self.telemetry_at_end.to_dict() - return ret + result_dict = {} + for attr, value in self.__dict__.items(): + if value is not None: + result_dict[attr] = value + result_dict["type"] = "workflow" + return result_dict + + def enrich(self, adapter_key=None): + self.utc_timestamp = flowcept.commons.utils.get_utc_now() + self.flowcept_settings = OmegaConf.to_container(settings) + + if adapter_key is not None: + # TODO :base-interceptor-refactor: :code-reorg: :usability: revisit all times we assume settings is not none + self.adapter_id = adapter_key + + if self.user is None: + self.user = FLOWCEPT_USER + + if self.campaign_id is None: + self.campaign_id = CAMPAIGN_ID + + if self.environment_id is None and ENVIRONMENT_ID is not None: + self.environment_id = ENVIRONMENT_ID + + if self.sys_name is None and SYS_NAME is not None: + self.sys_name = SYS_NAME + + if self.extra_metadata is None and EXTRA_METADATA is not None: + self.extra_metadata = OmegaConf.to_container(EXTRA_METADATA) + + if self.flowcept_version is None: + self.flowcept_version = __version__ + + def serialize(self): + return msgpack.dumps(self.to_dict()) + + @staticmethod + def deserialize(serialized_data) -> "WorkflowObject": + dict_obj = msgpack.loads(serialized_data) + obj = WorkflowObject() + for k, v in dict_obj.items(): + setattr(obj, k, v) + return obj def __repr__(self): return ( @@ -59,6 +115,8 @@ def __repr__(self): f"adapter_id={repr(self.adapter_id)}, " f"interceptor_ids={repr(self.interceptor_ids)}, " f"name={repr(self.name)}, " + f"used={repr(self.used)}, " + f"generated={repr(self.generated)}, " f"custom_metadata={repr(self.custom_metadata)})" ) diff --git a/flowcept/commons/query_utils.py b/flowcept/commons/query_utils.py index 5f6c8cb5..f878f987 100644 --- a/flowcept/commons/query_utils.py +++ b/flowcept/commons/query_utils.py @@ -29,7 +29,7 @@ def to_datetime(logger, df, column_name, _shift_hours=0): df[column_name], unit="s" ) + timedelta(hours=_shift_hours) except Exception as _e: - logger.exception(_e) + logger.info(_e) def _calc_telemetry_diff_for_row(start, end): diff --git a/flowcept/commons/settings_factory.py b/flowcept/commons/settings_factory.py index b6c5af8a..4bde09af 100644 --- a/flowcept/commons/settings_factory.py +++ b/flowcept/commons/settings_factory.py @@ -1,9 +1,5 @@ -import yaml - from flowcept.commons.vocabulary import Vocabulary -from flowcept.configs import ( - SETTINGS_PATH, -) +from flowcept.configs import settings from flowcept.commons.flowcept_dataclasses.base_settings_dataclasses import ( BaseSettings, @@ -39,9 +35,7 @@ def _build_base_settings(kind: str, settings_dict: dict) -> BaseSettings: def get_settings(adapter_key: str) -> BaseSettings: if adapter_key is None: # TODO: :base-interceptor-refactor: return None - with open(SETTINGS_PATH) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - settings_dict = data[Vocabulary.Settings.ADAPTERS][adapter_key] + settings_dict = settings[Vocabulary.Settings.ADAPTERS][adapter_key] if not settings_dict: raise Exception( f"You must specify the adapter <<{adapter_key}>> in" diff --git a/flowcept/commons/utils.py b/flowcept/commons/utils.py index 19c330ac..e4e9f999 100644 --- a/flowcept/commons/utils.py +++ b/flowcept/commons/utils.py @@ -6,19 +6,12 @@ import numpy as np import flowcept.commons -from flowcept.commons.flowcept_dataclasses.workflow_object import ( - WorkflowObject, -) from flowcept.configs import ( PERF_LOG, SETTINGS_PATH, - CAMPAIGN_ID, - FLOWCEPT_USER, - settings, ) from flowcept.commons.flowcept_logger import FlowceptLogger from flowcept.commons.flowcept_dataclasses.task_object import Status -from flowcept.version import __version__ def get_utc_now() -> float: @@ -61,14 +54,6 @@ def get_status_from_str(status_str: str) -> Status: return Status.UNKNOWN -def fill_with_basic_workflow_info(workflow_obj: WorkflowObject): - workflow_obj.campaign_id = CAMPAIGN_ID - workflow_obj.utc_timestamp = get_utc_now() - workflow_obj.user = FLOWCEPT_USER - workflow_obj.flowcept_settings = settings - workflow_obj.flowcept_version = __version__ - - def get_adapter_exception_msg(adapter_kind): return ( f"You have an adapter for {adapter_kind} in" @@ -121,6 +106,11 @@ def assert_by_querying_tasks_until( return False +def chunked(iterable, size): + for i in range(0, len(iterable), size): + yield iterable[i : i + size] + + # TODO: consider reusing this function in the function assert_by_querying_task_collections_until def evaluate_until( evaluation_condition: Callable, max_trials=30, max_time=60, msg="" diff --git a/flowcept/configs.py b/flowcept/configs.py index 4305351d..97438ad7 100644 --- a/flowcept/configs.py +++ b/flowcept/configs.py @@ -2,7 +2,7 @@ import socket import getpass -import yaml +from omegaconf import OmegaConf import random ######################## @@ -26,8 +26,7 @@ "under the project's root path." ) -with open(SETTINGS_PATH) as f: - settings = yaml.safe_load(f) +settings = OmegaConf.load(SETTINGS_PATH) ######################## # Log Settings # @@ -48,16 +47,20 @@ FLOWCEPT_USER = settings["experiment"].get("user", "blank_user") CAMPAIGN_ID = settings["experiment"].get("campaign_id", "super_campaign") -REGISTER_WORKFLOW = settings["experiment"].get("register_workflow", True) - ###################### # Redis Settings # ###################### REDIS_URI = settings["main_redis"].get("uri", None) -REDIS_HOST = settings["main_redis"].get("host", "localhost") -REDIS_PORT = int(settings["main_redis"].get("port", "6379")) +REDIS_INSTANCES = settings["main_redis"].get("instances", None) + REDIS_CHANNEL = settings["main_redis"].get("channel", "interception") REDIS_PASSWORD = settings["main_redis"].get("password", None) +REDIS_HOST = os.getenv( + "REDIS_HOST", settings["main_redis"].get("host", "localhost") +) +REDIS_PORT = int( + os.getenv("REDIS_PORT", settings["main_redis"].get("port", "6379")) +) REDIS_BUFFER_SIZE = int(settings["main_redis"].get("buffer_size", 50)) REDIS_INSERTION_BUFFER_TIME = int( @@ -67,6 +70,7 @@ int(REDIS_INSERTION_BUFFER_TIME * 0.9), int(REDIS_INSERTION_BUFFER_TIME * 1.4), ) +REDIS_CHUNK_SIZE = int(settings["main_redis"].get("chunk_size", -1)) ###################### # MongoDB Settings # @@ -75,11 +79,11 @@ MONGO_HOST = settings["mongodb"].get("host", "localhost") MONGO_PORT = int(settings["mongodb"].get("port", "27017")) MONGO_DB = settings["mongodb"].get("db", PROJECT_NAME) +MONGO_CREATE_INDEX = settings["mongodb"].get("create_collection_index", True) MONGO_TASK_COLLECTION = "tasks" MONGO_WORKFLOWS_COLLECTION = "workflows" - # In seconds: MONGO_INSERTION_BUFFER_TIME = int( settings["mongodb"].get("insertion_buffer_time_secs", 5) @@ -102,11 +106,12 @@ ###################### -# SYSTEM SETTINGS # +# PROJECT SYSTEM SETTINGS # ###################### +DB_FLUSH_MODE = settings["project"].get("db_flush_mode", "online") MQ_TYPE = settings["project"].get("mq_type", "redis") -DEBUG_MODE = settings["project"].get("debug", False) +# DEBUG_MODE = settings["project"].get("debug", False) PERF_LOG = settings["project"].get("performance_logging", False) JSON_SERIALIZER = settings["project"].get("json_serializer", "default") REPLACE_NON_JSON_SERIALIZABLE = settings["project"].get( @@ -115,25 +120,73 @@ ENRICH_MESSAGES = settings["project"].get("enrich_messages", True) TELEMETRY_CAPTURE = settings["project"].get("telemetry_capture", None) +REGISTER_WORKFLOW = settings["project"].get("register_workflow", True) +REGISTER_INSTRUMENTED_TASKS = settings["project"].get( + "register_instrumented_tasks", True +) ################################## # GPU TELEMETRY CAPTURE SETTINGS # ################################# +# TODO: This is legacy. We should improve the way to set these +# initial variables and initialize GPU libs. +# We could move this to the static part of TelemetryCapture N_GPUS = dict() -if TELEMETRY_CAPTURE.get("gpu", False): - try: - from pynvml import nvmlDeviceGetCount - - N_GPUS["nvidia"] = nvmlDeviceGetCount() - except: - pass - try: - import pyamdgpuinfo - - N_GPUS["amd"] = pyamdgpuinfo.detect_gpus() - except: - pass +GPU_HANDLES = None +if ( + TELEMETRY_CAPTURE is not None + and TELEMETRY_CAPTURE.get("gpu", None) is not None +): + if eval(TELEMETRY_CAPTURE.get("gpu", "None")) is not None: + try: + visible_devices_var = os.environ.get("CUDA_VISIBLE_DEVICES", None) + if visible_devices_var is not None: + visible_devices = [ + int(i) for i in visible_devices_var.split(",") + ] + if len(visible_devices): + N_GPUS["nvidia"] = visible_devices + GPU_HANDLES = [] # TODO + else: + from pynvml import nvmlDeviceGetCount + + N_GPUS["nvidia"] = list(range(0, nvmlDeviceGetCount())) + GPU_HANDLES = [] + except Exception as e: + # print(e) + pass + try: + visible_devices_var = os.environ.get("ROCR_VISIBLE_DEVICES", None) + if visible_devices_var is not None: + visible_devices = [ + int(i) for i in visible_devices_var.split(",") + ] + if len(visible_devices): + N_GPUS["amd"] = visible_devices + from amdsmi import ( + amdsmi_init, + amdsmi_get_processor_handles, + ) + + amdsmi_init() + GPU_HANDLES = amdsmi_get_processor_handles() + else: + from amdsmi import amdsmi_init, amdsmi_get_processor_handles + + amdsmi_init() + GPU_HANDLES = amdsmi_get_processor_handles() + N_GPUS["amd"] = list(range(0, len(GPU_HANDLES))) + except Exception as e: + # print(e) + pass + +if len(N_GPUS.get("amd", [])): + GPU_TYPE = "amd" +elif len(N_GPUS.get("nvidia", [])): + GPU_TYPE = "nvidia" +else: + GPU_TYPE = None ###################### # SYS METADATA # @@ -144,9 +197,11 @@ PRIVATE_IP = None SYS_NAME = None NODE_NAME = None +ENVIRONMENT_ID = None sys_metadata = settings.get("sys_metadata", None) if sys_metadata is not None: + ENVIRONMENT_ID = sys_metadata.get("environment_id", None) SYS_NAME = sys_metadata.get("sys_name", None) NODE_NAME = sys_metadata.get("node_name", None) LOGIN_NAME = sys_metadata.get("login_name", None) @@ -179,7 +234,9 @@ HOSTNAME = "unknown_hostname" -EXTRA_METADATA = settings.get("extra_metadata", None) +EXTRA_METADATA = settings.get("extra_metadata", {}) +EXTRA_METADATA.update({"mq_host": REDIS_HOST}) +EXTRA_METADATA.update({"mq_port": REDIS_PORT}) ###################### # Web Server # @@ -194,6 +251,11 @@ ANALYTICS = settings.get("analytics", None) + +#### + +INSTRUMENTATION = settings.get("instrumentation", None) + ################# Enabled ADAPTERS ADAPTERS = set() diff --git a/flowcept/flowcept_api/consumer_api.py b/flowcept/flowcept_api/consumer_api.py index 9c69ae39..f06451b1 100644 --- a/flowcept/flowcept_api/consumer_api.py +++ b/flowcept/flowcept_api/consumer_api.py @@ -1,7 +1,11 @@ from typing import List, Union from time import sleep +import flowcept.instrumentation.decorators +from flowcept.commons import logger +from flowcept.commons.daos.document_db_dao import DocumentDBDao from flowcept.commons.daos.mq_dao import MQDao +from flowcept.configs import REDIS_INSTANCES from flowcept.flowceptor.consumers.document_inserter import DocumentInserter from flowcept.commons.flowcept_logger import FlowceptLogger from flowcept.flowceptor.adapters.base_interceptor import BaseInterceptor @@ -9,14 +13,28 @@ # TODO: :code-reorg: This may not be considered an API anymore as it's doing critical things for the good functioning of the system. class FlowceptConsumerAPI(object): + INSTRUMENTATION = "instrumentation" + def __init__( self, - interceptors: Union[BaseInterceptor, List[BaseInterceptor]] = None, + interceptors: Union[ + BaseInterceptor, List[BaseInterceptor], str + ] = None, + bundle_exec_id=None, + start_doc_inserter=True, ): self.logger = FlowceptLogger() - self._document_inserter: DocumentInserter = None - self._mq_dao = MQDao() + self._document_inserters: List[DocumentInserter] = [] + self._start_doc_inserter = start_doc_inserter + if bundle_exec_id is None: + self._bundle_exec_id = id(self) + else: + self._bundle_exec_id = bundle_exec_id + if interceptors == FlowceptConsumerAPI.INSTRUMENTATION: + interceptors = ( + flowcept.instrumentation.decorators.instrumentation_interceptor + ) if interceptors is not None and type(interceptors) != list: interceptors = [interceptors] self._interceptors: List[BaseInterceptor] = interceptors @@ -35,14 +53,32 @@ def start(self): else: key = interceptor.settings.key self.logger.debug(f"Flowceptor {key} starting...") - interceptor.start(bundle_exec_id=id(self)) + interceptor.start(bundle_exec_id=self._bundle_exec_id) self.logger.debug(f"...Flowceptor {key} started ok!") - self.logger.debug("Flowcept Consumer starting...") - self._document_inserter = DocumentInserter( - check_safe_stops=True - ).start() - # sleep(1) + if self._start_doc_inserter: + self.logger.debug("Flowcept Consumer starting...") + + if REDIS_INSTANCES is not None and len(REDIS_INSTANCES): + for mq_host_port in REDIS_INSTANCES: + split = mq_host_port.split(":") + mq_host = split[0] + mq_port = int(split[1]) + self._document_inserters.append( + DocumentInserter( + check_safe_stops=True, + mq_host=mq_host, + mq_port=mq_port, + bundle_exec_id=self._bundle_exec_id, + ).start() + ) + else: + self._document_inserters.append( + DocumentInserter( + check_safe_stops=True, + bundle_exec_id=self._bundle_exec_id, + ).start() + ) self.logger.debug("Ok, we're consuming messages!") self.is_started = True return self @@ -51,9 +87,8 @@ def stop(self): if not self.is_started: self.logger.warning("Consumer is already stopped!") return - sleep_time = 1 - self.logger.debug( + self.logger.info( f"Received the stop signal. We're going to wait {sleep_time} secs." f" before gracefully stopping..." ) @@ -65,20 +100,35 @@ def stop(self): key = id(interceptor) else: key = interceptor.settings.key - self.logger.debug(f"Flowceptor {key} stopping...") + self.logger.info(f"Flowceptor {key} stopping...") interceptor.stop() - self.logger.debug("... ok!") - self.logger.debug("Stopping Doc Inserter...") - self._document_inserter.stop(bundle_exec_id=id(self)) + if self._start_doc_inserter: + self.logger.info("Stopping Doc Inserters...") + for doc_inserter in self._document_inserters: + doc_inserter.stop(bundle_exec_id=id(self)) self.is_started = False self.logger.debug("All stopped!") - def reset_time_based_threads_tracker(self): - self._mq_dao.delete_all_time_based_threads_sets() - def __enter__(self): self.start() return self def __exit__(self, exc_type, exc_val, exc_tb): self.stop() + + @staticmethod + def start_instrumentation_interceptor(): + flowcept.instrumentation.decorators.instrumentation_interceptor.start( + None + ) + + @staticmethod + def services_alive() -> bool: + if not MQDao().liveness_test(): + logger.error("MQ Not Ready!") + return False + if not DocumentDBDao().liveness_test(): + logger.error("DocDB Not Ready!") + return False + logger.info("MQ and DocDB are alive!") + return True diff --git a/flowcept/flowcept_api/db_api.py b/flowcept/flowcept_api/db_api.py index c70b7d8a..6103b6fa 100644 --- a/flowcept/flowcept_api/db_api.py +++ b/flowcept/flowcept_api/db_api.py @@ -1,5 +1,5 @@ import uuid -from typing import Dict +from typing import List from flowcept.commons import singleton from flowcept.commons.flowcept_dataclasses.workflow_object import ( @@ -42,18 +42,26 @@ def insert_or_update_workflow( return workflow_obj def get_workflow(self, workflow_id) -> WorkflowObject: - return self.workflow_query( - filter={TaskObject.workflow_id_field(): workflow_id} + wfobs = self.workflow_query( + filter={WorkflowObject.workflow_id_field(): workflow_id} ) + if wfobs is None or len(wfobs) == 0: + self.logger.error("Could not retrieve workflow with that filter.") + return None + else: + return wfobs[0] - def workflow_query(self, filter) -> WorkflowObject: + def workflow_query(self, filter) -> List[WorkflowObject]: results = self._dao.workflow_query(filter=filter) if results is None: self.logger.error("Could not retrieve workflow with that filter.") return None if len(results): try: - return WorkflowObject(**results[0]) + lst = [] + for wf_dict in results: + lst.append(WorkflowObject.from_dict(wf_dict)) + return lst except Exception as e: self.logger.exception(e) return None @@ -83,3 +91,98 @@ def dump_to_file( except Exception as e: self.logger.exception(e) return False + + def save_object( + self, + object, + object_id=None, + task_id=None, + workflow_id=None, + type=None, + custom_metadata=None, + pickle=False, + ): + return self._dao.save_object( + object, + object_id, + task_id, + workflow_id, + type, + custom_metadata, + pickle_=pickle, + ) + + def query( + self, + filter=None, + projection=None, + limit=0, + sort=None, + aggregation=None, + remove_json_unserializables=True, + type="task", + ): + if type == "task": + return self._dao.task_query( + filter, + projection, + limit, + sort, + aggregation, + remove_json_unserializables, + ) + elif type == "workflow": + return self._dao.workflow_query( + filter, projection, limit, sort, remove_json_unserializables + ) + elif type == "object": + return self._dao.get_objects(filter) + else: + raise Exception( + f"You used type={type}, but we only have " + f"collections for task and workflow." + ) + + def save_torch_model(self, model, custom_metadata: dict = None) -> str: + """ + Save the PyTorch model's state_dict to a MongoDB collection as binary data. + + Args: + model (torch.nn.Module): The PyTorch model to be saved. + custom_metadata (Dict[str, str]): Custom metadata to be stored with the model. + + Returns: + str: The object ID of the saved model in the database. + """ + import torch + import io + + state_dict = model.state_dict() + buffer = io.BytesIO() + torch.save(state_dict, buffer) + buffer.seek(0) + binary_data = buffer.read() + cm = { + **custom_metadata, + "class": model.__class__.__name__, + } + obj_id = self.save_object( + object=binary_data, + type="ml_model", + custom_metadata=cm, + ) + + return obj_id + + def load_torch_model(self, torch_model, object_id: str): + import torch + import io + + doc = self.query({"object_id": object_id}, type="object")[0] + binary_data = doc["data"] + + buffer = io.BytesIO(binary_data) + state_dict = torch.load(buffer, weights_only=True) + torch_model.load_state_dict(state_dict) + + return torch_model diff --git a/flowcept/flowcept_api/task_query_api.py b/flowcept/flowcept_api/task_query_api.py index b2d71d3f..f15d351b 100644 --- a/flowcept/flowcept_api/task_query_api.py +++ b/flowcept/flowcept_api/task_query_api.py @@ -139,7 +139,7 @@ def query( else: self.logger.error("Error when executing query.") - def get_subworkflow_tasks_from_a_parent_workflow( + def get_subworkflows_tasks_from_a_parent_workflow( self, parent_workflow_id: str ) -> List[Dict]: """ @@ -153,11 +153,16 @@ def get_subworkflow_tasks_from_a_parent_workflow( """ db_api = DBAPI() - sub_wf = db_api.workflow_query( + sub_wfs = db_api.workflow_query( {"parent_workflow_id": parent_workflow_id} ) - sub_wf_docs = self.query({"workflow_id": sub_wf.workflow_id}) - return sub_wf_docs + if not sub_wfs: + return None + tasks = [] + for sub_wf in sub_wfs: + sub_wf_tasks = self.query({"workflow_id": sub_wf.workflow_id}) + tasks.extend(sub_wf_tasks) + return tasks def df_query( self, @@ -255,7 +260,7 @@ def _get_dataframe_from_task_docs( + timedelta(hours=shift_hours) ) except Exception as e: - self.logger.exception(e) + self.logger.info(e) try: df["elapsed_time"] = df["ended_at"] - df["started_at"] @@ -265,7 +270,7 @@ def _get_dataframe_from_task_docs( else -1 ) except Exception as e: - self.logger.exception(e) + self.logger.info(e) return df @@ -462,9 +467,9 @@ def find_interesting_tasks_based_on_correlations_generated_and_telemetry_data( def find_interesting_tasks_based_on_xyz( self, - pattern_x="^generated[.](?!responsible_ai_metrics[.]).*", # loss, acc + pattern_x="^generated[.](?!responsible_ai_metadata[.]).*", # loss, acc pattern_y="^telemetry_diff[.].*", # telemetry - pattern_z="^generated[.]responsible_ai_metrics[.].*$", # params + pattern_z="^generated[.]responsible_ai_metadata[.].*$", # params filter=None, correlation_threshold=0.5, top_k=50, diff --git a/flowcept/flowceptor/adapters/base_interceptor.py b/flowcept/flowceptor/adapters/base_interceptor.py index 37f6a4a3..fa44e9c7 100644 --- a/flowcept/flowceptor/adapters/base_interceptor.py +++ b/flowcept/flowceptor/adapters/base_interceptor.py @@ -1,21 +1,9 @@ -import uuid from abc import ABCMeta, abstractmethod from flowcept.commons.flowcept_dataclasses.workflow_object import ( WorkflowObject, ) -from flowcept.flowcept_api.db_api import DBAPI -from flowcept.commons.utils import get_utc_now, fill_with_basic_workflow_info from flowcept.configs import ( - FLOWCEPT_USER, - SYS_NAME, - NODE_NAME, - LOGIN_NAME, - PUBLIC_IP, - PRIVATE_IP, - CAMPAIGN_ID, - HOSTNAME, - EXTRA_METADATA, ENRICH_MESSAGES, ) from flowcept.commons.flowcept_logger import FlowceptLogger @@ -36,7 +24,7 @@ # in the code. https://github.com/ORNL/flowcept/issues/109 # class BaseInterceptor(object, metaclass=ABCMeta): class BaseInterceptor(object): - def __init__(self, plugin_key): + def __init__(self, plugin_key=None): self.logger = FlowceptLogger() if ( plugin_key is not None @@ -44,54 +32,13 @@ def __init__(self, plugin_key): self.settings = get_settings(plugin_key) else: self.settings = None - self._mq_dao = MQDao() - self._db_api = DBAPI() + self._mq_dao = MQDao(adapter_settings=self.settings) + # self._db_api = DBAPI() self._bundle_exec_id = None self._interceptor_instance_id = str(id(self)) self.telemetry_capture = TelemetryCapture() + self._saved_workflows = set() self._generated_workflow_id = False - self._registered_workflow = False - - def _enrich_task_message(self, settings_key, task_msg: TaskObject): - if task_msg.utc_timestamp is None: - task_msg.utc_timestamp = get_utc_now() - - if task_msg.adapter_id is None: - task_msg.adapter_id = settings_key - - if task_msg.user is None: - task_msg.user = FLOWCEPT_USER - - if task_msg.campaign_id is None: - task_msg.campaign_id = CAMPAIGN_ID - - if task_msg.sys_name is None: - task_msg.sys_name = SYS_NAME - - if task_msg.node_name is None: - task_msg.node_name = NODE_NAME - - if task_msg.login_name is None: - task_msg.login_name = LOGIN_NAME - - if task_msg.public_ip is None and PUBLIC_IP is not None: - task_msg.public_ip = PUBLIC_IP - - if task_msg.private_ip is None and PRIVATE_IP is not None: - task_msg.private_ip = PRIVATE_IP - - if task_msg.hostname is None and HOSTNAME is not None: - task_msg.hostname = HOSTNAME - - if task_msg.extra_metadata is None and EXTRA_METADATA is not None: - task_msg.extra_metadata = EXTRA_METADATA - - if task_msg.flowcept_version is None: - task_msg.flowcept_version = __version__ - - if task_msg.workflow_id is None and not self._generated_workflow_id: - task_msg.workflow_id = str(uuid.uuid4()) - self._generated_workflow_id = True def prepare_task_msg(self, *args, **kwargs) -> TaskObject: raise NotImplementedError() @@ -102,10 +49,9 @@ def start(self, bundle_exec_id) -> "BaseInterceptor": :return: """ self._bundle_exec_id = bundle_exec_id - self._mq_dao.start_time_based_flushing( + self._mq_dao.init_buffer( self._interceptor_instance_id, bundle_exec_id ) - self.telemetry_capture.init_gpu_telemetry() return self def stop(self) -> bool: @@ -113,10 +59,7 @@ def stop(self) -> bool: Gracefully stops an interceptor :return: """ - self._mq_dao.stop_time_based_flushing( - self._interceptor_instance_id, self._bundle_exec_id - ) - self.telemetry_capture.shutdown_gpu_telemetry() + self._mq_dao.stop(self._interceptor_instance_id, self._bundle_exec_id) def observe(self, *args, **kwargs): """ @@ -136,50 +79,50 @@ def callback(self, *args, **kwargs): """ raise NotImplementedError() - def register_workflow(self, task_msg: TaskObject): - self._registered_workflow = True - if task_msg.workflow_id is None: + def send_workflow_message(self, workflow_obj: WorkflowObject): + wf_id = workflow_obj.workflow_id + if wf_id is None: + self.logger.warning( + f"Workflow_id is empty, we can't save this workflow_obj: {workflow_obj}" + ) return - - workflow_obj = WorkflowObject() - workflow_obj.workflow_id = task_msg.workflow_id - fill_with_basic_workflow_info(workflow_obj) + if wf_id in self._saved_workflows: + return + self._saved_workflows.add(wf_id) + if self._mq_dao.buffer is None: + # TODO :base-interceptor-refactor: :code-reorg: :usability: + raise Exception( + f"This interceptor {id(self)} has never been started!" + ) workflow_obj.interceptor_ids = [self._interceptor_instance_id] - machine_info = self.telemetry_capture.capture_machine_info() if machine_info is not None: if workflow_obj.machine_info is None: - workflow_obj.machine_info = {} + workflow_obj.machine_info = dict() # TODO :refactor-base-interceptor: we might want to register machine info even when there's no observer workflow_obj.machine_info[ self._interceptor_instance_id ] = machine_info - - self._db_api.insert_or_update_workflow(workflow_obj) - - def intercept(self, task_msg: TaskObject): - if ( - self._mq_dao._buffer is None - ): # TODO :base-interceptor-refactor: :code-reorg: :usability: - raise Exception( - f"This interceptor {id(self)} has never been started!" - ) - if ENRICH_MESSAGES: - if ( - self.settings is not None - ): # TODO :base-interceptor-refactor: :code-reorg: :usability: revisit all times we assume settings is not none - key = self.settings.key - else: - key = None - self._enrich_task_message(key, task_msg) - - if not self._registered_workflow: - self.register_workflow(task_msg) - - _msg = task_msg.to_dict() - self.logger.debug( - f"Going to send to Redis an intercepted message:" - f"\n\t[BEGIN_MSG]{_msg}\n[END_MSG]\t" - ) - self._mq_dao.publish(_msg) + workflow_obj.enrich(self.settings.key if self.settings else None) + self.intercept(workflow_obj.to_dict()) + + def intercept(self, obj_msg): + self._mq_dao.buffer.append(obj_msg) + + # def intercept_appends_only(self, obj_msg): + # self._mq_dao.buffer.append(obj_msg) + # + # def intercept_appends_with_checks(self, obj_msg): + # # self._mq_dao._lock.acquire() + # # self._mq_dao.buffer.append(obj_msg) + # self._mq_dao.buffer.append(obj_msg) + # # if len(self._mq_dao.buffer) >= REDIS_BUFFER_SIZE: + # # self.logger.critical("Redis buffer exceeded, flushing...") + # # self._mq_dao.flush() + # # self._mq_dao._lock.release() + + # def intercept(self, obj_msg: Dict): + # pass + # #self._mq_dao._buffer.append(obj_msg) + # #self._mq_dao.publish(obj_msg) diff --git a/flowcept/flowceptor/adapters/dask/dask_interceptor.py b/flowcept/flowceptor/adapters/dask/dask_interceptor.py index 89edb9c0..a096148d 100644 --- a/flowcept/flowceptor/adapters/dask/dask_interceptor.py +++ b/flowcept/flowceptor/adapters/dask/dask_interceptor.py @@ -1,5 +1,6 @@ -import pickle +import inspect +from flowcept import WorkflowObject from flowcept.commons.flowcept_dataclasses.task_object import ( TaskObject, Status, @@ -8,60 +9,81 @@ BaseInterceptor, ) from flowcept.commons.utils import get_utc_now, replace_non_serializable -from flowcept.configs import TELEMETRY_CAPTURE, REPLACE_NON_JSON_SERIALIZABLE +from flowcept.configs import ( + TELEMETRY_CAPTURE, + REPLACE_NON_JSON_SERIALIZABLE, + REGISTER_WORKFLOW, + ENRICH_MESSAGES, +) def get_run_spec_data(task_msg: TaskObject, run_spec): - def _get_arg(arg_name): - if type(run_spec) == dict: - return run_spec.get(arg_name, None) - elif hasattr(run_spec, arg_name): - return getattr(run_spec, arg_name) - return None - - def _parse_dask_tuple(_tuple: tuple): - forth_elem = None - if len(_tuple) == 3: - _, _, value_tuple = _tuple - elif len(_tuple) == 4: - _, _, value_tuple, forth_elem = _tuple - - _, value = value_tuple - if len(value) == 1: # Value is always an array here - value = value[0] - ret_obj = {"value": value} - - if forth_elem is not None and type(forth_elem) == dict: - ret_obj.update(forth_elem) - else: - pass # We don't know yet what to do if this happens. So just pass. - - return ret_obj + # def _get_arg(arg_name): + # if type(run_spec) == dict: + # return run_spec.get(arg_name, None) + # elif hasattr(run_spec, arg_name): + # return getattr(run_spec, arg_name) + # return None + # + # def _parse_dask_tuple(_tuple: tuple): + # forth_elem = None + # if len(_tuple) == 3: + # _, _, value_tuple = _tuple + # elif len(_tuple) == 4: + # _, _, value_tuple, forth_elem = _tuple + # + # _, value = value_tuple + # if len(value) == 1: # Value is always an array here + # value = value[0] + # ret_obj = {"value": value} + # + # if forth_elem is not None and type(forth_elem) == dict: + # ret_obj.update(forth_elem) + # else: + # pass # We don't know yet what to do if this happens. So just pass. + # + # return ret_obj + + func = run_spec[0] + args = run_spec[1] + kwargs = run_spec[2] task_msg.used = {} - arg_val = _get_arg("args") - if arg_val is not None: - picked_args = pickle.loads(arg_val) - # pickled_args is always a tuple - i = 0 - for arg in picked_args: - task_msg.used[f"arg{i}"] = arg - i += 1 - - arg_val = _get_arg("kwargs") - if arg_val is not None: - picked_kwargs = pickle.loads(arg_val) - if "workflow_id" in picked_kwargs: - task_msg.workflow_id = picked_kwargs.pop("workflow_id") - if len(picked_kwargs): - task_msg.used.update(picked_kwargs) - - arg_val = _get_arg("task") # This happens in case of client.map - if arg_val is not None and type(arg_val) == tuple: - task_obj = _parse_dask_tuple(arg_val) - if "workflow_id" in task_obj: - task_msg.workflow_id = task_obj.pop("workflow_id") - task_msg.used = task_obj["value"] + if args: + params = list(inspect.signature(func).parameters) + for k, v in zip(params, args): + task_msg.used[k] = v + + if kwargs: + if "workflow_id" in kwargs and not task_msg.workflow_id: + task_msg.workflow_id = kwargs.get("workflow_id") + task_msg.used.update(kwargs) + task_msg.used.pop("workflow_id", None) + + # + # arg_val = _get_arg("args") + # if arg_val is not None: + # picked_args = pickle.loads(arg_val) + # # pickled_args is always a tuple + # i = 0 + # for arg in picked_args: + # task_msg.used[f"arg{i}"] = arg + # i += 1 + # + # arg_val = _get_arg("kwargs") + # if arg_val is not None: + # picked_kwargs = pickle.loads(arg_val) + # if "workflow_id" in picked_kwargs: + # task_msg.workflow_id = picked_kwargs.pop("workflow_id") + # if len(picked_kwargs): + # task_msg.used.update(picked_kwargs) + + # arg_val = _get_arg("task") # This happens in case of client.map + # if arg_val is not None and type(arg_val) == tuple: + # task_obj = _parse_dask_tuple(arg_val) + # if "workflow_id" in task_obj: + # task_msg.workflow_id = task_obj.pop("workflow_id") + # task_msg.used = task_obj["value"] if REPLACE_NON_JSON_SERIALIZABLE: task_msg.used = replace_non_serializable(task_msg.used) @@ -95,11 +117,7 @@ def callback(self, task_id, start, finish, *args, **kwargs): if ts.state == "waiting": task_msg = TaskObject() task_msg.task_id = task_id - task_msg.custom_metadata = { - "scheduler": self._scheduler.address_safe, - "scheduler_id": self._scheduler.id, - "scheduler_pid": self._scheduler.proc.pid, - } + task_msg.status = Status.SUBMITTED if self.settings.scheduler_create_timestamps: task_msg.submitted_at = get_utc_now() @@ -112,7 +130,19 @@ def callback(self, task_id, start, finish, *args, **kwargs): if self.settings.scheduler_should_get_input: if hasattr(ts, "run_spec"): get_run_spec_data(task_msg, ts.run_spec) - self.intercept(task_msg) + + if REGISTER_WORKFLOW: + if hasattr(self._scheduler, "current_workflow"): + wf_obj: WorkflowObject = ( + self._scheduler.current_workflow + ) + task_msg.workflow_id = wf_obj.workflow_id + self.send_workflow_message(wf_obj) + else: + # TODO: we can't do much if the user didn't register the wf + pass + + self.intercept(task_msg.to_dict()) except Exception as e: self.logger.error("Error with dask scheduler!") @@ -132,6 +162,7 @@ def setup_worker(self, worker): """ self._worker = worker super().__init__(self._plugin_key) + self._generated_workflow_id = True # TODO: :refactor: This is just to avoid the auto-generation of workflow id, which doesnt make sense in Dask case.. super().start(bundle_exec_id=self._worker.scheduler.address) # Note that both scheduler and worker get the exact same input. # Worker does not resolve intermediate inputs, just like the scheduler. @@ -196,8 +227,10 @@ def callback(self, task_id, start, finish, *args, **kwargs): task_msg.generated = replace_non_serializable( task_msg.generated ) + if ENRICH_MESSAGES: + task_msg.enrich(self._plugin_key) - self.intercept(task_msg) + self.intercept(task_msg.to_dict()) except Exception as e: self.logger.error( diff --git a/flowcept/flowceptor/adapters/dask/dask_plugins.py b/flowcept/flowceptor/adapters/dask/dask_plugins.py index 512ee314..039f1a9c 100644 --- a/flowcept/flowceptor/adapters/dask/dask_plugins.py +++ b/flowcept/flowceptor/adapters/dask/dask_plugins.py @@ -1,12 +1,57 @@ -from dask.distributed import WorkerPlugin, SchedulerPlugin +from uuid import uuid4 +from dask.distributed import WorkerPlugin, SchedulerPlugin +from distributed import Client +from flowcept import WorkflowObject from flowcept.flowceptor.adapters.dask.dask_interceptor import ( DaskSchedulerInterceptor, DaskWorkerInterceptor, ) +def _set_workflow_on_scheduler( + dask_scheduler=None, + workflow_id=None, + custom_metadata: dict = None, + used: dict = None, +): + custom_metadata = custom_metadata or {} + wf_obj = WorkflowObject() + wf_obj.workflow_id = workflow_id + custom_metadata.update( + { + "workflow_type": "DaskWorkflow", + "scheduler": dask_scheduler.address_safe, + "scheduler_id": dask_scheduler.id, + "scheduler_pid": dask_scheduler.proc.pid, + "clients": len(dask_scheduler.clients), + "n_workers": len(dask_scheduler.workers), + } + ) + wf_obj.custom_metadata = custom_metadata + wf_obj.used = used + setattr(dask_scheduler, "current_workflow", wf_obj) + + +def register_dask_workflow( + dask_client: Client, + workflow_id=None, + custom_metadata: dict = None, + used: dict = None, +): + workflow_id = workflow_id or str(uuid4()) + dask_client.run_on_scheduler( + _set_workflow_on_scheduler, + **{ + "workflow_id": workflow_id, + "custom_metadata": custom_metadata, + "used": used, + }, + ) + return workflow_id + + class FlowceptDaskSchedulerAdapter(SchedulerPlugin): def __init__(self, scheduler): self.address = scheduler.address diff --git a/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py b/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py index 14a28641..89489356 100644 --- a/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +++ b/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py @@ -56,7 +56,7 @@ def callback(self): self.state_manager.add_element_id(run_uuid) if not run_data: continue - task_msg = self.prepare_task_msg(run_data) + task_msg = self.prepare_task_msg(run_data).to_dict() self.intercept(task_msg) def start(self, bundle_exec_id) -> "MLFlowInterceptor": diff --git a/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py b/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py index 7b46d302..abf53edc 100644 --- a/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +++ b/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py @@ -85,7 +85,7 @@ def callback(self): if task_msg.task_id is None: self.logger.error("This is an error") # TODO: logger - self.intercept(task_msg) + self.intercept(task_msg.to_dict()) self.state_manager.add_element_id(child_event.log_path) def start(self, bundle_exec_id) -> "TensorboardInterceptor": diff --git a/flowcept/flowceptor/adapters/zambeze/zambeze_interceptor.py b/flowcept/flowceptor/adapters/zambeze/zambeze_interceptor.py index 066cb72c..27b77d9d 100644 --- a/flowcept/flowceptor/adapters/zambeze/zambeze_interceptor.py +++ b/flowcept/flowceptor/adapters/zambeze/zambeze_interceptor.py @@ -94,7 +94,7 @@ def _intercept(self, body_obj): f"\n\t{json.dumps(body_obj)}" ) task_msg = self.prepare_task_msg(body_obj) - self.intercept(task_msg) + self.intercept(task_msg.to_dict()) def callback(self, ch, method, properties, body): body_obj = json.loads(body) diff --git a/flowcept/flowceptor/consumers/document_inserter.py b/flowcept/flowceptor/consumers/document_inserter.py index 0ba8aed0..6f752998 100644 --- a/flowcept/flowceptor/consumers/document_inserter.py +++ b/flowcept/flowceptor/consumers/document_inserter.py @@ -1,9 +1,14 @@ -import json +import msgpack from time import time, sleep from threading import Thread, Event, Lock from typing import Dict -from datetime import datetime +from uuid import uuid4 +import flowcept.commons +from flowcept.commons.daos.autoflush_buffer import AutoflushBuffer +from flowcept.commons.flowcept_dataclasses.workflow_object import ( + WorkflowObject, +) from flowcept.commons.utils import GenericJSONDecoder from flowcept.commons.flowcept_dataclasses.task_object import TaskObject from flowcept.configs import ( @@ -11,7 +16,6 @@ MONGO_MAX_BUFFER_SIZE, MONGO_MIN_BUFFER_SIZE, MONGO_ADAPTIVE_BUFFER_SIZE, - DEBUG_MODE, JSON_SERIALIZER, MONGO_REMOVE_EMPTY_FIELDS, ) @@ -37,17 +41,29 @@ def remove_empty_fields(d): # TODO: :code-reorg: Should this be in utils? elif value in (None, ""): del d[key] - def __init__(self, check_safe_stops=True): - self._buffer = list() - self._mq_dao = MQDao() + def __init__( + self, + check_safe_stops=True, + mq_host=None, + mq_port=None, + bundle_exec_id=None, + ): + self._task_dicts_buffer = list() + self._mq_dao = MQDao(mq_host, mq_port) self._doc_dao = DocumentDBDao() self._previous_time = time() self.logger = FlowceptLogger() self._main_thread: Thread = None self._curr_max_buffer_size = MONGO_MAX_BUFFER_SIZE self._lock = Lock() + self._bundle_exec_id = bundle_exec_id self.check_safe_stops = check_safe_stops - # self._safe_to_stop = not check_safe_stops + self.buffer: AutoflushBuffer = AutoflushBuffer( + max_size=self._curr_max_buffer_size, + flush_interval=MONGO_INSERTION_BUFFER_TIME, + flush_function=DocumentInserter.flush_function, + doc_dao=self._doc_dao, + ) def _set_buffer_size(self): if not MONGO_ADAPTIVE_BUFFER_SIZE: @@ -55,9 +71,9 @@ def _set_buffer_size(self): else: # Adaptive buffer size to increase/decrease depending on the flow # of messages (#messages/unit of time) - if len(self._buffer) >= MONGO_MAX_BUFFER_SIZE: + if len(self._task_dicts_buffer) >= MONGO_MAX_BUFFER_SIZE: self._curr_max_buffer_size = MONGO_MAX_BUFFER_SIZE - elif len(self._buffer) < self._curr_max_buffer_size: + elif len(self._task_dicts_buffer) < self._curr_max_buffer_size: # decrease buffer size by 10%, lower-bounded by 10 self._curr_max_buffer_size = max( MONGO_MIN_BUFFER_SIZE, @@ -74,35 +90,68 @@ def _set_buffer_size(self): ), ) - def _flush(self): - self._set_buffer_size() - with self._lock: - if len(self._buffer): - self.logger.debug( - f"Current Doc buffer size: {len(self._buffer)}, " - f"Gonna flush {len(self._buffer)} msgs to DocDB!" - ) - inserted = self._doc_dao.insert_and_update_many( - TaskObject.task_id_field(), self._buffer - ) - if not inserted: - self.logger.warning( - f"Could not insert the buffer correctly. " - f"Buffer content={self._buffer}" - ) - else: - self.logger.debug( - f"Flushed {len(self._buffer)} msgs to DocDB!" - ) - self._buffer = list() + @staticmethod + def flush_function(buffer, doc_dao, logger=flowcept.commons.logger): + logger.info( + f"Current Doc buffer size: {len(buffer)}, " + f"Gonna flush {len(buffer)} msgs to DocDB!" + ) + inserted = doc_dao.insert_and_update_many( + TaskObject.task_id_field(), buffer + ) + if not inserted: + logger.warning( + f"Could not insert the buffer correctly. " + f"Buffer content={buffer}" + ) + else: + logger.info(f"Flushed {len(buffer)} msgs to DocDB!") + + # + # def _flush(self): + # self._set_buffer_size() + # with self._lock: + # if len(self._task_dicts_buffer): + # self.logger.info( + # f"Current Doc buffer size: {len(self._task_dicts_buffer)}, " + # f"Gonna flush {len(self._task_dicts_buffer)} msgs to DocDB!" + # ) + # inserted = self._doc_dao.insert_and_update_many( + # TaskObject.task_id_field(), self._task_dicts_buffer + # ) + # if not inserted: + # self.logger.warning( + # f"Could not insert the buffer correctly. " + # f"Buffer content={self._task_dicts_buffer}" + # ) + # else: + # self.logger.info( + # f"Flushed {len(self._task_dicts_buffer)} msgs to DocDB!" + # ) + # self._task_dicts_buffer = list() def handle_task_message(self, message: Dict): - if "utc_timestamp" in message: - dt = datetime.fromtimestamp(message["utc_timestamp"]) - message["timestamp"] = dt.utcnow() + # if "utc_timestamp" in message: + # dt = datetime.fromtimestamp(message["utc_timestamp"]) + # message["timestamp"] = dt.utcnow() + + # if DEBUG_MODE: + # message["debug"] = True + if "task_id" not in message: + message["task_id"] = str(uuid4()) + + if "workflow_id" not in message and len(message.get("used", {})): + wf_id = message.get("used").get("workflow_id", None) + if wf_id: + message["workflow_id"] = wf_id - if DEBUG_MODE: - message["debug"] = True + if not any( + time_field in message + for time_field in TaskObject.get_time_field_names() + ): + message["registered_at"] = time() + + message.pop("type") self.logger.debug( f"Received following msg in DocInserter:" @@ -110,37 +159,81 @@ def handle_task_message(self, message: Dict): ) if MONGO_REMOVE_EMPTY_FIELDS: remove_empty_fields_from_dict(message) - self._buffer.append(message) - - if len(self._buffer) >= self._curr_max_buffer_size: - self.logger.debug("Docs buffer exceeded, flushing...") - self._flush() - - def time_based_flushing(self, event: Event): - while not event.is_set(): - if len(self._buffer): - now = time() - timediff = now - self._previous_time - if timediff >= MONGO_INSERTION_BUFFER_TIME: - self.logger.debug("Time to flush to doc db!") - self._previous_time = now - self._flush() - self.logger.debug( - f"Time-based DocDB inserter going to wait for {MONGO_INSERTION_BUFFER_TIME} s." + + self.buffer.append(message) + # with self._lock: + # self._task_dicts_buffer.append(message) + # if len(self._task_dicts_buffer) >= self._curr_max_buffer_size: + # self.logger.debug("Docs buffer exceeded, flushing...") + # self._flush() + + def handle_workflow_message(self, message: Dict): + message.pop("type") + self.logger.debug( + f"Received following msg in DocInserter:" + f"\n\t[BEGIN_MSG]{message}\n[END_MSG]\t" + ) + if MONGO_REMOVE_EMPTY_FIELDS: + remove_empty_fields_from_dict(message) + wf_obj = WorkflowObject.from_dict(message) + inserted = self._doc_dao.workflow_insert_or_update(wf_obj) + return inserted + + def handle_control_message(self, message): + self.logger.info( + f"I'm doc inserter {id(self)}. I received this control msg received: {message}" + ) + if message["info"] == "mq_dao_thread_stopped": + exec_bundle_id = message.get("exec_bundle_id", None) + interceptor_instance_id = message.get("interceptor_instance_id") + self.logger.info( + f"I'm doc inserter id {id(self)}. I ack that I received mq_dao_thread_stopped message " + f"in DocInserter from the interceptor " + f"{'' if exec_bundle_id is None else exec_bundle_id}_{interceptor_instance_id}!" + ) + self.logger.info( + f"Begin register_time_based_thread_end " + f"{'' if exec_bundle_id is None else exec_bundle_id}_{interceptor_instance_id}!" + ) + self._mq_dao.register_time_based_thread_end( + interceptor_instance_id, exec_bundle_id ) - sleep(MONGO_INSERTION_BUFFER_TIME) + self.logger.info( + f"Done register_time_based_thread_end " + f"{'' if exec_bundle_id is None else exec_bundle_id}_{interceptor_instance_id}!" + ) + return "continue" + elif message["info"] == "stop_document_inserter": + self.logger.info("Document Inserter is stopping...") + return "stop" + + # def time_based_flushing(self, event: Event): + # while not event.is_set(): + # with self._lock: + # if len(self._task_dicts_buffer): + # now = time() + # timediff = now - self._previous_time + # if timediff >= MONGO_INSERTION_BUFFER_TIME: + # self.logger.debug("Time to flush to doc db!") + # self._previous_time = now + # self._flush() + # self.logger.debug( + # f"Time-based DocDB inserter going to wait for {MONGO_INSERTION_BUFFER_TIME} s." + # ) + # event.wait(MONGO_INSERTION_BUFFER_TIME) + # self.logger.debug("Broke the time_based_flushing in Doc Inserter!") - def start(self): + def start(self) -> "DocumentInserter": self._main_thread = Thread(target=self._start) self._main_thread.start() return self def _start(self): stop_event = Event() - time_thread = Thread( - target=self.time_based_flushing, args=(stop_event,) - ) - time_thread.start() + # time_thread = Thread( + # target=self.time_based_flushing, args=(stop_event,) + # ) + # time_thread.start() pubsub = self._mq_dao.subscribe() should_continue = True while should_continue: @@ -149,44 +242,25 @@ def _start(self): self.logger.debug("Doc inserter Received a message!") if message["type"] in MQDao.MESSAGE_TYPES_IGNORE: continue - _dict_obj = json.loads( - message["data"], cls=DocumentInserter.DECODER + _dict_obj = msgpack.loads( + message["data"] # , cls=DocumentInserter.DECODER ) - if ( - "type" in _dict_obj - and _dict_obj["type"] == "flowcept_control" - ): - if _dict_obj["info"] == "mq_dao_thread_stopped": - exec_bundle_id = _dict_obj.get( - "exec_bundle_id", None - ) - interceptor_instance_id = _dict_obj.get( - "interceptor_instance_id" - ) - self.logger.debug( - f"Received mq_dao_thread_stopped message " - f"in DocInserter from the interceptor " - f"{''if exec_bundle_id is None else exec_bundle_id}_{interceptor_instance_id}!" - ) - self._mq_dao.register_time_based_thread_end( - interceptor_instance_id, exec_bundle_id - ) - # if self._mq_dao.all_time_based_threads_ended( - # exec_bundle_id - # ): - # self._safe_to_stop = True - # self.logger.debug("It is safe to stop.") - - elif _dict_obj["info"] == "stop_document_inserter": - self.logger.info( - "Document Inserter is stopping..." - ) + msg_type = _dict_obj.get("type") + if msg_type == "flowcept_control": + r = self.handle_control_message(_dict_obj) + if r == "stop": stop_event.set() - self._flush() + self.buffer.stop() should_continue = False break - else: + elif msg_type == "task": self.handle_task_message(_dict_obj) + elif msg_type == "workflow": + self.handle_workflow_message(_dict_obj) + elif msg_type is None: + raise Exception("Please inform the message type.") + else: + self.logger.error("Unexpected message type") self.logger.debug( "Processed all MQ msgs in doc_inserter we got so far. " "Now waiting (hopefully not forever!) on the " @@ -196,35 +270,36 @@ def _start(self): self.logger.exception(e) sleep(2) self.logger.debug("Still in the doc insert. message listen loop") - self.logger.debug( - "Ok, we broke the doc inserter message listen loop!" - ) - time_thread.join() + self.logger.info("Ok, we broke the doc inserter message listen loop!") + # time_thread.join() + # self.logger.info("Joined time thread in doc inserter.") def stop(self, bundle_exec_id=None): if self.check_safe_stops: + max_trials = 60 + trial = 0 while not self._mq_dao.all_time_based_threads_ended( bundle_exec_id ): + trial += 1 sleep_time = 3 - self.logger.debug( - f"It's still not safe to stop DocInserter. " - f"Checking again in {sleep_time} secs." + self.logger.info( + f"Doc Inserter {id(self)}: It's still not safe to stop DocInserter. " + f"Checking again in {sleep_time} secs. Trial={trial}." ) sleep(sleep_time) - self._mq_dao.stop_document_inserter() + if trial >= max_trials: + if ( + len(self._task_dicts_buffer) == 0 + ): # and len(self._mq_dao._buffer) == 0: + self.logger.critical( + f"Doc Inserter {id(self)} gave up on waiting for the signal. It is probably safe to stop by now." + ) + break + self.logger.info("Sending message to stop document inserter.") + self._mq_dao.send_document_inserter_stop() + self.logger.info( + f"Doc Inserter {id(self)} Sent message to stop itself." + ) self._main_thread.join() self.logger.info("Document Inserter is stopped.") - - # def stop(self): - # while not self._safe_to_stop: - # sleep_time = 3 - # self.logger.debug( - # f"It's still not safe to stop DocInserter. " - # f"Checking again in {sleep_time} secs." - # ) - # sleep(sleep_time) - # - # self._mq_dao.stop_document_inserter() - # self._main_thread.join() - # self.logger.info("Document Inserter is stopped.") diff --git a/flowcept/flowceptor/telemetry_capture.py b/flowcept/flowceptor/telemetry_capture.py index 5ce491be..6a3271e2 100644 --- a/flowcept/flowceptor/telemetry_capture.py +++ b/flowcept/flowceptor/telemetry_capture.py @@ -3,39 +3,106 @@ import cpuinfo import os -try: - import pynvml - from pynvml import ( - nvmlDeviceGetCount, - nvmlDeviceGetHandleByIndex, - nvmlDeviceGetMemoryInfo, - nvmlDeviceGetName, - nvmlInit, - nvmlShutdown, - nvmlDeviceGetTemperature, - nvmlDeviceGetPowerUsage, - NVML_TEMPERATURE_GPU, - ) -except: - pass -try: - import pyamdgpuinfo -except: - pass from flowcept.commons.flowcept_logger import FlowceptLogger -from flowcept.configs import TELEMETRY_CAPTURE, N_GPUS, HOSTNAME, LOGIN_NAME +from flowcept.configs import ( + TELEMETRY_CAPTURE, + N_GPUS, + GPU_HANDLES, + GPU_TYPE, + HOSTNAME, + LOGIN_NAME, +) from flowcept.commons.flowcept_dataclasses.telemetry import Telemetry +if GPU_TYPE == "nvidia": + try: + import pynvml + from pynvml import ( + nvmlDeviceGetCount, + nvmlDeviceGetHandleByIndex, + nvmlDeviceGetMemoryInfo, + nvmlDeviceGetName, + nvmlInit, + nvmlShutdown, + nvmlDeviceGetTemperature, + nvmlDeviceGetPowerUsage, + NVML_TEMPERATURE_GPU, + ) + except Exception as e: + print(f"We could not import NVIDIA libs: {e}") + pass + +if GPU_TYPE == "amd": + try: + from amdsmi import ( + amdsmi_get_gpu_memory_usage, + amdsmi_get_processor_handles, + amdsmi_shut_down, + amdsmi_get_gpu_memory_usage, + AmdSmiMemoryType, + AmdSmiTemperatureType, + amdsmi_get_gpu_activity, + amdsmi_get_power_info, + amdsmi_get_gpu_device_uuid, + amdsmi_get_temp_metric, + AmdSmiTemperatureMetric, + amdsmi_get_gpu_metrics_info, + amdsmi_get_processor_handles, + amdsmi_init, + ) + except Exception as e: + print(f"Exception to import AMD libs! {e}") + pass + +# from amdsmi import amdsmi_init, amdsmi_get_processor_handles + class TelemetryCapture: + _gpu_unsuccessful_queries = ( + dict() + ) # TODO: refactor; I need this to avoid querying GPU stuff that is generating errors. The idea is to try once and if it fails, add this in this dictionary to avoid trying again. The mapping will be {gpu_device_id: {query_type: True or False}}; False if it found that it's unsuccessful. If it's mapping to an empty dict, the whole GPU is bad for capture. + def __init__(self, conf=TELEMETRY_CAPTURE): - self.conf = conf self.logger = FlowceptLogger() + self.conf = conf + if self.conf is not None: + self._visible_gpus = None + self._gpu_type = GPU_TYPE + self._gpu_conf = self.conf.get("gpu", None) + + if self._gpu_conf is None: + return + + if isinstance(self._gpu_conf, str): + self._gpu_conf = eval(self.conf.get("gpu", "None")) + + if self._gpu_conf is None: + return + + self._gpu_conf = set(self._gpu_conf) + + if len(self._gpu_conf): + self.logger.info( + f"These are the visible GPUs by Flowcept Capture: {N_GPUS}" + ) + # TODO: refactor! This below is bad coding + nvidia = N_GPUS.get("nvidia", []) + amd = N_GPUS.get("amd", []) + if len(nvidia): + self._visible_gpus = nvidia + self._gpu_capture_func = self.__get_gpu_info_nvidia + elif len(amd): + self._visible_gpus = amd + self._gpu_capture_func = self.__get_gpu_info_amd + else: + self.logger.exception( + "You are trying to capture telemetry GPU info, but we" + " couldn't detect any GPU, neither NVIDIA nor AMD. Consider disabling GPU capture in the settings file." + ) def capture(self) -> Telemetry: if self.conf is None: return None - tel = Telemetry() if self.conf.get("process_info", False): tel.process = self._capture_process_info() @@ -54,7 +121,9 @@ def capture(self) -> Telemetry: if self.conf.get("disk", False): tel.disk = self._capture_disk() - if self.conf.get("gpu", False): + if self._gpu_conf is not None and len( + self._gpu_conf + ): # TODO we might want to turn all tel types into lists tel.gpu = self._capture_gpu() return tel @@ -77,7 +146,7 @@ def capture_machine_info(self): processor_info = cpuinfo.get_cpu_info() gpu_info = None - if self.conf.get("gpu", False): + if self._gpu_conf is not None and len(self._gpu_conf): gpu_info = self._capture_gpu() info = { @@ -86,7 +155,7 @@ def capture_machine_info(self): "platform": platform_info, "cpu": processor_info, "network": network_info, - "environment": os.environ, + "environment": dict(os.environ), "hostname": HOSTNAME, "login_name": LOGIN_NAME, "process": self._capture_process_info().__dict__, @@ -196,134 +265,101 @@ def __get_gpu_info_nvidia(self, gpu_ix: int = 0): ), "power_usage": nvmlDeviceGetPowerUsage(handle), "name": nvmlDeviceGetName(handle), + "device_ix": gpu_ix, } - return flowcept_gpu_info - def __get_gpu_info_amd(self, gpu_ix: int = 0): - flowcept_gpu_info = {} - try: - amd_info = pyamdgpuinfo.get_gpu(gpu_ix) - except Exception as e: - self.logger.exception(e) - return flowcept_gpu_info - - memory_info = amd_info.memory_info.copy() - try: - flowcept_gpu_info["total"] = memory_info.pop("vram_size") - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["temperature"] = amd_info.query_temperature() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["power_usage"] = amd_info.query_power() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["used"] = amd_info.query_vram_usage() - except Exception as e: - self.logger.exception(e) - - try: - max_clocks = amd_info.query_max_clocks() - flowcept_gpu_info["max_shader_clock"] = max_clocks["sclk_max"] - flowcept_gpu_info["max_memory_clock"] = max_clocks["mclk_max"] - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["shader_clock"] = amd_info.query_sclk() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["memory_clock"] = amd_info.query_mclk() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["gtt_usage"] = amd_info.query_gtt_usage() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info["load"] = amd_info.query_load() - except Exception as e: - self.logger.exception(e) - - try: - flowcept_gpu_info[ - "graphics_voltage" - ] = amd_info.query_graphics_voltage() - except Exception as e: - self.logger.exception(e) - - flowcept_gpu_info.update(memory_info) - - try: - name = amd_info.name - if name is not None: - flowcept_gpu_info["name"] = name - except Exception as e: - self.logger.exception(e) + def __register_unsuccessful_gpu_query(self, gpu_ix, gpu_info_key): + self.logger.error( + f"Error to get {gpu_info_key} for the GPU device ix {gpu_ix}" + ) + if gpu_ix not in TelemetryCapture._gpu_unsuccessful_queries: + TelemetryCapture._gpu_unsuccessful_queries[gpu_ix] = {} + TelemetryCapture._gpu_unsuccessful_queries[gpu_ix][ + gpu_info_key + ] = True + def __get_gpu_info_amd(self, gpu_ix: int = 0): + # See: https://rocm.docs.amd.com/projects/amdsmi/en/docs-5.7.1/py-interface_readme_link.html#api + device = GPU_HANDLES[gpu_ix] + flowcept_gpu_info = {"gpu_ix": gpu_ix} + + if "used" in self._gpu_conf: + flowcept_gpu_info["used"] = amdsmi_get_gpu_memory_usage( + device, AmdSmiMemoryType.VRAM + ) + if "usage" in self._gpu_conf: + flowcept_gpu_info["usage"] = amdsmi_get_gpu_activity(device) + if "power" in self._gpu_conf: + flowcept_gpu_info["power"] = amdsmi_get_power_info(device) + if "id" in self._gpu_conf: + flowcept_gpu_info["id"] = amdsmi_get_gpu_device_uuid(device) + if "temperature" in self._gpu_conf: + temperature = { + "vram": amdsmi_get_temp_metric( + device, + AmdSmiTemperatureType.VRAM, + AmdSmiTemperatureMetric.CURRENT, + ), + "hotspot": amdsmi_get_temp_metric( + device, + AmdSmiTemperatureType.HOTSPOT, + AmdSmiTemperatureMetric.CURRENT, + ), + "edge": amdsmi_get_temp_metric( + device, + AmdSmiTemperatureType.EDGE, + AmdSmiTemperatureMetric.CURRENT, + ), + } + flowcept_gpu_info["temperature"] = temperature + if ( + "metrics" in self._gpu_conf + ): # USE IT CAREFULLY because it contains redundant information + flowcept_gpu_info["metrics"] = amdsmi_get_gpu_metrics_info(device) return flowcept_gpu_info def _capture_gpu(self): try: - if len(N_GPUS) == 0: - self.logger.exception( - "You are trying to capture telemetry GPU info, but we" - " couldn't detect any GPU, neither NVIDIA nor AMD." - " Please set GPU telemetry capture to false." - ) - return None - - n_nvidia_gpus = N_GPUS.get("nvidia", 0) - n_amd_gpus = N_GPUS.get("amd", 0) - - if n_nvidia_gpus > 0: - n_gpus = n_nvidia_gpus - gpu_capture_func = self.__get_gpu_info_nvidia - elif n_amd_gpus > 0: - n_gpus = n_amd_gpus - gpu_capture_func = self.__get_gpu_info_amd - else: - self.logger.exception("This should never happen.") - return None - + if ( + self._visible_gpus is None + or self._gpu_conf is None + or len(self._gpu_conf) == 0 + ): + return gpu_telemetry = {} - for i in range(0, n_gpus): - gpu_telemetry[i] = gpu_capture_func(i) - + for gpu_ix in self._visible_gpus: + gpu_telemetry[f"gpu_{gpu_ix}"] = self._gpu_capture_func( + gpu_ix + ) return gpu_telemetry except Exception as e: self.logger.exception(e) return None - def init_gpu_telemetry(self): - if self.conf is None: + def shutdown_gpu_telemetry(self): + if ( + self.conf is None + or self._visible_gpus is None + or self._gpu_conf is None + or len(self._gpu_conf) == 0 + ): + self.logger.debug( + "Gpu capture is off or gpu capture has never been initialized, so we won't shut down." + ) return None - # These methods are only needed for NVIDIA GPUs - if N_GPUS.get("nvidia", 0) > 0: + if self._gpu_type == "nvidia": try: - nvmlInit() + nvmlShutdown() except Exception as e: - self.logger.error("NVIDIA GPU NOT FOUND!") + self.logger.error("Error to shutdown GPU capture") self.logger.exception(e) - - def shutdown_gpu_telemetry(self): - if self.conf is None: - return None - # These methods are only needed for NVIDIA GPUs - if N_GPUS.get("nvidia", 0) > 0: + elif self._gpu_type == "amd": try: - nvmlShutdown() + amdsmi_shut_down() except Exception as e: - self.logger.error("NVIDIA GPU NOT FOUND!") + self.logger.error("Error to shutdown GPU capture") self.logger.exception(e) + else: + self.logger.error("Could not end any GPU!") + self.logger.debug("GPU capture end!") diff --git a/flowcept/instrumentation/decorators/__init__.py b/flowcept/instrumentation/decorators/__init__.py index 07342856..1d68cb1a 100644 --- a/flowcept/instrumentation/decorators/__init__.py +++ b/flowcept/instrumentation/decorators/__init__.py @@ -6,8 +6,7 @@ # Perhaps we should have a BaseAdaptor that would work for both and # observability and instrumentation adapters. This would be a major refactor # in the code. https://github.com/ORNL/flowcept/issues/109 -instrumentation_interceptor = BaseInterceptor(plugin_key=None) -instrumentation_interceptor._registered_workflow = True +instrumentation_interceptor = BaseInterceptor() # TODO This above is bad because I am reusing the same BaseInterceptor both # for adapter-based observability + traditional instrumentation via @decorator # I'm just setting _registered_workflow to avoid the auto wf register that diff --git a/flowcept/instrumentation/decorators/flowcept_task.py b/flowcept/instrumentation/decorators/flowcept_task.py index 6a611e57..92841931 100644 --- a/flowcept/instrumentation/decorators/flowcept_task.py +++ b/flowcept/instrumentation/decorators/flowcept_task.py @@ -1,6 +1,5 @@ -import uuid from time import time - +from functools import wraps import flowcept.commons from flowcept.commons.flowcept_dataclasses.task_object import ( TaskObject, @@ -9,41 +8,129 @@ from flowcept.instrumentation.decorators import instrumentation_interceptor from flowcept.commons.utils import replace_non_serializable -from flowcept.configs import REPLACE_NON_JSON_SERIALIZABLE -from functools import wraps +from flowcept.configs import ( + REPLACE_NON_JSON_SERIALIZABLE, + REGISTER_INSTRUMENTED_TASKS, +) # TODO: :code-reorg: consider moving it to utils and reusing it in dask interceptor -def default_args_handler(task_message, *args, **kwargs): +def default_args_handler(task_message: TaskObject, *args, **kwargs): args_handled = {} if args is not None and len(args): for i in range(len(args)): args_handled[f"arg_{i}"] = args[i] if kwargs is not None and len(kwargs): - task_message.workflow_id = kwargs.pop("workflow_id", None) + task_message.workflow_id = task_message.workflow_id or kwargs.pop( + "workflow_id", None + ) args_handled.update(kwargs) if REPLACE_NON_JSON_SERIALIZABLE: args_handled = replace_non_serializable(args_handled) return args_handled +def telemetry_flowcept_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + task_obj = {} + task_obj["type"] = "task" + task_obj["started_at"] = time() + task_obj["activity_id"] = func.__qualname__ + task_obj["task_id"] = str(id(task_obj)) + task_obj["workflow_id"] = kwargs.pop("workflow_id") + task_obj["used"] = kwargs + tel = instrumentation_interceptor.telemetry_capture.capture() + if tel is not None: + task_obj["telemetry_at_start"] = tel.to_dict() + try: + result = func(*args, **kwargs) + task_obj["status"] = Status.FINISHED.value + except Exception as e: + task_obj["status"] = Status.ERROR.value + result = None + task_obj["stderr"] = str(e) + # task_obj["ended_at"] = time() + tel = instrumentation_interceptor.telemetry_capture.capture() + if tel is not None: + task_obj["telemetry_at_end"] = tel.to_dict() + task_obj["generated"] = result + instrumentation_interceptor.intercept(task_obj) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + +def lightweight_flowcept_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + # t0 = time() + # task_obj["started_at"] = time() + # task_obj["type"] = "task" + + # task_obj["task_id"] = t0 + + # task_obj["used"] = kwargs + result = func(*args, **kwargs) + # try: + # task_obj["status"] = Status.FINISHED.value + # except Exception as e: + # task_obj["status"] = Status.ERROR.value + # result = None + # task_obj["stderr"] = str(e) + # task_obj["ended_at"] = time() + # generatedKV = task_obj_pb2.GeneratedKV(key="y", val=result["y"]) + # task_obj = task_obj_pb2.TaskObject(type="task", + # workflow_id=kwargs.pop( + # "workflow_id"), + # activity_id=func.__name__, + # y=result["y"] + # ) + + task_dict = dict( + type="task", + # workflow_id=kwargs.pop("workflow_id", None), + activity_id=func.__name__, + used=kwargs, + generated=result, + ) + instrumentation_interceptor.intercept(task_dict) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + def flowcept_task(func=None, **decorator_kwargs): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): - task_obj = TaskObject() - task_obj.activity_id = func.__name__ - task_obj.task_id = str(uuid.uuid4()) + if not REGISTER_INSTRUMENTED_TASKS: + return func(*args, **kwargs) args_handler = decorator_kwargs.get( "args_handler", default_args_handler ) + task_obj = TaskObject() + task_obj.activity_id = func.__name__ + task_obj.used = args_handler(task_obj, *args, **kwargs) + task_obj.started_at = time() + task_obj.task_id = str(task_obj.started_at) task_obj.telemetry_at_start = ( instrumentation_interceptor.telemetry_capture.capture() ) - task_obj.started_at = time() - task_obj.used = args_handler(task_obj, *args, **kwargs) try: result = func(*args, **kwargs) task_obj.status = Status.FINISHED @@ -63,7 +150,7 @@ def wrapper(*args, **kwargs): except Exception as e: flowcept.commons.logger.exception(e) - instrumentation_interceptor.intercept(task_obj) + instrumentation_interceptor.intercept(task_obj.to_dict()) return result return wrapper diff --git a/flowcept/instrumentation/decorators/flowcept_torch.py b/flowcept/instrumentation/decorators/flowcept_torch.py index 059ee4f1..7a6205b9 100644 --- a/flowcept/instrumentation/decorators/flowcept_torch.py +++ b/flowcept/instrumentation/decorators/flowcept_torch.py @@ -1,78 +1,282 @@ +from time import time +from functools import wraps +import flowcept.commons +from flowcept.commons.flowcept_dataclasses.task_object import ( + Status, +) +from flowcept.instrumentation.decorators import instrumentation_interceptor from typing import List, Dict +import uuid import torch from torch import nn import flowcept.commons -from flowcept import DBAPI from flowcept.commons.flowcept_dataclasses.workflow_object import ( WorkflowObject, ) -from flowcept.commons.utils import replace_non_serializable -from flowcept.configs import REPLACE_NON_JSON_SERIALIZABLE +from flowcept.configs import ( + REGISTER_WORKFLOW, + INSTRUMENTATION, + TELEMETRY_CAPTURE, +) -from flowcept.instrumentation.decorators.flowcept_task import flowcept_task + +# class FrequencyCount: +# counter = 0 +# MAX = INSTRUMENTATION["torch"]["max_frequency"] def _inspect_torch_tensor(tensor: torch.Tensor): - tensor_inspection = { - "id": id(tensor), - "device": tensor.device.type, - "is_sparse": tensor.is_sparse, - "shape": list(tensor.shape), - "nbytes": tensor.nbytes, - "numel": tensor.numel(), - "density": torch.nonzero(tensor).size(0) / tensor.numel(), - } + _id = id(tensor) + tensor_inspection = {"id": _id} + # try: + # tensor_inspection["device"] = tensor.device.type + # except Exception as e: + # logger.warning(f"For tensor {_id} could not get its device. Exc: {e}") + tensor_inspection["is_sparse"] = tensor.is_sparse + tensor_inspection["shape"] = list(tensor.shape) + # tensor_inspection["nbytes"] = tensor.nbytes + # except Exception as e: + # logger.warning( + # f"For tensor {_id}, could not get its nbytes. Exc: {e}" + # ) + # try: # no torch + # tensor_inspection["numel"] = tensor.numel() + # except Exception as e: + # logger.warning(f"For tensor {_id}, could not get its numel. Exc: {e}") + # try: # no torch + # tensor_inspection["density"] = ( + # torch.nonzero(tensor).size(0) / tensor.numel() + # ) + # except Exception as e: + # logger.warning( + # f"For tensor {_id}, could not get its density. Exc: {e}" + # ) return tensor_inspection -def torch_args_handler(task_message, *args, **kwargs): - try: - args_handled = {} - if args is not None and len(args): - for i in range(len(args)): - arg = args[i] - if isinstance(arg, nn.Module): - task_message.activity_id = arg.__class__.__name__ - custom_metadata = {} - module_dict = arg.__dict__ - for k in module_dict: - if k == "workflow_id": - task_message.workflow_id = module_dict[k] - elif not k.startswith("_"): - custom_metadata[k] = module_dict[k] - - if len(custom_metadata): - if REPLACE_NON_JSON_SERIALIZABLE: - custom_metadata = replace_non_serializable( - custom_metadata - ) - task_message.custom_metadata = custom_metadata - - elif isinstance(arg, torch.Tensor): - args_handled[f"tensor_{i}"] = _inspect_torch_tensor(arg) - else: - args_handled[f"arg_{i}"] = arg - - if task_message.workflow_id is None and hasattr( - arg, "workflow_id" - ): - task_message.workflow_id = getattr(arg, "workflow_id") - - if kwargs is not None and len(kwargs): - if task_message.workflow_id is None: - task_message.workflow_id = kwargs.pop("workflow_id", None) - args_handled.update(kwargs) - if REPLACE_NON_JSON_SERIALIZABLE: - args_handled = replace_non_serializable(args_handled) - return args_handled - except Exception as e: - flowcept.commons.logger.exception(e) - return None - - -@flowcept_task(args_handler=torch_args_handler) +def full_torch_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + task_obj = {} + task_obj["type"] = "task" + task_obj["started_at"] = time() + + task_obj["activity_id"] = (func.__qualname__,) + task_obj["task_id"] = str(id(task_obj)) + if hasattr(args[0], "parent_task_id"): + task_obj["parent_task_id"] = args[0].parent_task_id + task_obj["workflow_id"] = args[0].workflow_id + task_obj["used"] = { + "tensor": _inspect_torch_tensor(args[1]), + **{ + k: v + for k, v in vars(args[0]).items() + if not k.startswith("_") + }, + } + task_obj[ + "telemetry_at_start" + ] = ( + instrumentation_interceptor.telemetry_capture.capture().to_dict() + ) + try: + result = func(*args, **kwargs) + task_obj["status"] = Status.FINISHED.value + except Exception as e: + task_obj["status"] = Status.ERROR.value + result = None + task_obj["stderr"] = str(e) + task_obj["ended_at"] = time() + task_obj[ + "telemetry_at_end" + ] = ( + instrumentation_interceptor.telemetry_capture.capture().to_dict() + ) + task_obj["generated"] = { + "tensor": _inspect_torch_tensor(args[1]), + # add other module metadata + } + instrumentation_interceptor.intercept(task_obj) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + +# +# def _handle_torch_arg(task_dict_field, arg): +# for k, v in vars(arg).items(): +# if not k.startswith("_"): +# if isinstance(v, torch.Tensor): +# task_dict_field[k] = _inspect_torch_tensor(v) +# elif callable(v): +# task_dict_field[k] = v.__qualname__ +# else: +# task_dict_field[k] = v + + +def lightweight_tensor_inspection_torch_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + used = {"tensor": _inspect_torch_tensor(args[1])} + for k, v in vars(args[0]).items(): + if not k.startswith("_"): + if isinstance(v, torch.Tensor): + used[k] = _inspect_torch_tensor(v) + elif callable(v): + used[k] = v.__qualname__ + else: + used[k] = v + task_dict = dict( + type="task", + workflow_id=args[0].workflow_id, + parent_task_id=args[0].parent_task_id, + activity_id=func.__qualname__, + used=used, + generated={"tensor": _inspect_torch_tensor(result)}, + ) + instrumentation_interceptor.intercept(task_dict) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + +def lightweight_telemetry_tensor_inspection_torch_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + used = {"tensor": _inspect_torch_tensor(args[1])} + for k, v in vars(args[0]).items(): + if not k.startswith("_"): + if isinstance(v, torch.Tensor): + used[k] = _inspect_torch_tensor(v) + elif callable(v): + used[k] = v.__qualname__ + else: + used[k] = v + task_dict = dict( + type="task", + workflow_id=args[0].workflow_id, + parent_task_id=args[0].parent_task_id, + activity_id=args[0].__class__.__name__, + used=used, + generated={"tensor": _inspect_torch_tensor(result)}, + telemetry_at_start=instrumentation_interceptor.telemetry_capture.capture().to_dict(), + ) + instrumentation_interceptor.intercept(task_dict) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + +# def lightweight_telemetry_tensor_inspection_counted_torch_task(func=None): +# def decorator(func): +# @wraps(func) +# def wrapper(*args, **kwargs): +# FrequencyCount.counter += 1 +# result = func(*args, **kwargs) +# if FrequencyCount.counter < FrequencyCount.MAX: +# return result +# FrequencyCount.counter = 0 +# used = {"tensor": _inspect_torch_tensor(args[1])} +# for k, v in vars(args[0]).items(): +# if not k.startswith("_"): +# if isinstance(v, torch.Tensor): +# used[k] = _inspect_torch_tensor(v) +# elif callable(v): +# used[k] = v.__qualname__ +# else: +# used[k] = v +# task_dict = dict( +# type="task", +# workflow_id=args[0].workflow_id, +# parent_task_id=args[0].parent_task_id, +# activity_id=args[0].__class__.__name__, +# used=used, +# generated={"tensor": _inspect_torch_tensor(result)}, +# telemetry_at_start=instrumentation_interceptor.telemetry_capture.capture().to_dict(), +# ) +# instrumentation_interceptor.intercept(task_dict) +# return result +# +# return wrapper +# +# if func is None: +# return decorator +# else: +# return decorator(func) + + +def lightweight_telemetry_torch_task(func=None): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + # We are commenting out everything we can to reduce overhead, + # as this function is called multiple times in parallel + result = func(*args, **kwargs) + task_dict = dict( + type="task", + workflow_id=args[0].workflow_id, + activity_id=func.__qualname__, + telemetry_at_start=instrumentation_interceptor.telemetry_capture.capture().to_dict(), + ) + instrumentation_interceptor.intercept(task_dict) + return result + + return wrapper + + if func is None: + return decorator + else: + return decorator(func) + + +def torch_task(): + mode = INSTRUMENTATION["torch"]["mode"] + if mode is None: + return lambda _: _ + if "telemetry" in mode and TELEMETRY_CAPTURE is None: + raise Exception( + "Your telemetry settings are null but you chose a " + "telemetry mode. Please revise your settings." + ) + # elif mode == "lightweight_base": + # return lightweight_base_torch_task + elif mode == "tensor_inspection": + return lightweight_tensor_inspection_torch_task + elif mode == "telemetry": + return lightweight_telemetry_torch_task + elif mode == "telemetry_and_tensor_inspection": + return lightweight_telemetry_tensor_inspection_torch_task + elif mode == "full": + return full_torch_task + else: + raise NotImplementedError( + f"There is no torch instrumentation mode {mode}" + ) + + +@torch_task() def _our_forward(self, *args, **kwargs): return super(self.__class__, self).forward(*args, **kwargs) @@ -92,13 +296,20 @@ def _create_dynamic_class(base_class, class_name, extra_attributes): def register_modules( - modules: List[nn.Module], workflow_id: str = None + modules: List[nn.Module], + workflow_id: str = None, + parent_task_id: str = None, ) -> Dict[nn.Module, nn.Module]: flowcept_torch_modules: List[nn.Module] = [] for module in modules: new_module = _create_dynamic_class( - module, f"Flowcept{module.__name__}", {"workflow_id": workflow_id} + module, + f"Flowcept{module.__name__}", + extra_attributes={ + "workflow_id": workflow_id, + "parent_task_id": parent_task_id, + }, ) flowcept_torch_modules.append(new_module) if len(flowcept_torch_modules) == 1: @@ -107,9 +318,23 @@ def register_modules( return flowcept_torch_modules -def register_module_as_workflow(module: nn.Module, parent_workflow_id=None): +def register_module_as_workflow( + module: nn.Module, + parent_workflow_id=None, + # parent_task_id=None, + custom_metadata: Dict = None, +): workflow_obj = WorkflowObject() + workflow_obj.workflow_id = str(uuid.uuid4()) workflow_obj.parent_workflow_id = parent_workflow_id workflow_obj.name = module.__class__.__name__ - DBAPI().insert_or_update_workflow(workflow_obj) + _custom_metadata = custom_metadata or {} + _custom_metadata["workflow_type"] = "TorchModule" + workflow_obj.custom_metadata = custom_metadata + # workflow_obj.parent_task_id = parent_task_id + + if REGISTER_WORKFLOW: + flowcept.instrumentation.decorators.instrumentation_interceptor.send_workflow_message( + workflow_obj + ) return workflow_obj.workflow_id diff --git a/flowcept/instrumentation/decorators/responsible_ai.py b/flowcept/instrumentation/decorators/responsible_ai.py index d2a3f902..9356fdb4 100644 --- a/flowcept/instrumentation/decorators/responsible_ai.py +++ b/flowcept/instrumentation/decorators/responsible_ai.py @@ -1,46 +1,46 @@ -import shap +from functools import wraps import numpy as np from torch import nn - +from flowcept import DBAPI from flowcept.commons.utils import replace_non_serializable -from flowcept.configs import REPLACE_NON_JSON_SERIALIZABLE - - -def model_explainer(background_size=100, test_data_size=3): - def decorator(func): - def wrapper(*args, **kwargs): - result = func(*args, **kwargs) - error_format_msg = ( - "You must return a dict in the form:" - " {'model': model," - " 'test_data': test_data}" - ) - if type(result) != dict: - raise Exception(error_format_msg) - model = result.get("model", None) - test_data = result.get("test_data", None) - - if model is None or test_data is None: - raise Exception(error_format_msg) - if not hasattr(test_data, "__getitem__"): - raise Exception("Test_data must be subscriptable.") - - background = test_data[:background_size] - test_images = test_data[background_size:test_data_size] - - e = shap.DeepExplainer(model, background) - shap_values = e.shap_values(test_images) - # result["shap_values"] = shap_values - if "responsible_ai_metrics" not in result: - result["responsible_ai_metrics"] = {} - result["responsible_ai_metrics"]["shap_sum"] = float( - np.sum(np.concatenate(shap_values)) - ) - return result - - return wrapper - - return decorator +from flowcept.configs import REPLACE_NON_JSON_SERIALIZABLE, INSTRUMENTATION + + +# def model_explainer(background_size=100, test_data_size=3): +# def decorator(func): +# def wrapper(*args, **kwargs): +# result = func(*args, **kwargs) +# error_format_msg = ( +# "You must return a dict in the form:" +# " {'model': model," +# " 'test_data': test_data}" +# ) +# if type(result) != dict: +# raise Exception(error_format_msg) +# model = result.get("model", None) +# test_data = result.get("test_data", None) + +# if model is None or test_data is None: +# raise Exception(error_format_msg) +# if not hasattr(test_data, "__getitem__"): +# raise Exception("Test_data must be subscriptable.") + +# background = test_data[:background_size] +# test_images = test_data[background_size:test_data_size] + +# e = shap.DeepExplainer(model, background) +# shap_values = e.shap_values(test_images) +# # result["shap_values"] = shap_values +# if "responsible_ai_metadata" not in result: +# result["responsible_ai_metadata"] = {} +# result["responsible_ai_metadata"]["shap_sum"] = float( +# np.sum(np.concatenate(shap_values)) +# ) +# return result + +# return wrapper + +# return decorator def _inspect_inner_modules(model, modules_dict={}, in_named=None): @@ -61,15 +61,20 @@ def _inspect_inner_modules(model, modules_dict={}, in_named=None): return modules_dict -def model_profiler(name=None): +def model_profiler(): def decorator(func): + @wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) - error_format_msg = ( - "You must return a dict in the form:" " {'model': model," + if type(result) != dict or "model" not in result: + raise Exception( + "We expect that you give us the model so we can profile it. Return a dict with a 'model' key in it with the pytorch model to be profiled." + ) + + random_seed = ( + result["random_seed"] if "random_seed" in result else None ) - if type(result) != dict: - raise Exception(error_format_msg) + model = result.pop("model", None) nparams = 0 max_width = -1 @@ -91,17 +96,24 @@ def wrapper(*args, **kwargs): "modules": modules, "model_repr": repr(model), } - if name is not None: - this_result["name"] = name + if random_seed is not None: + this_result["random_seed"] = random_seed ret = {} if not isinstance(result, dict): ret["result"] = result else: ret = result - if "responsible_ai_metrics" not in ret: - ret["responsible_ai_metrics"] = {} - ret["responsible_ai_metrics"].update(this_result) - + if "responsible_ai_metadata" not in ret: + ret["responsible_ai_metadata"] = {} + ret["responsible_ai_metadata"].update(this_result) + + if INSTRUMENTATION.get("torch", False) and INSTRUMENTATION[ + "torch" + ].get("save_models", False): + obj_id = DBAPI().save_torch_model( + model, ret["responsible_ai_metadata"] + ) + ret["object_id"] = obj_id return ret return wrapper diff --git a/flowcept/main.py b/flowcept/main.py index 2e0da79c..7e1d69d1 100644 --- a/flowcept/main.py +++ b/flowcept/main.py @@ -1,7 +1,5 @@ import sys -import yaml - from flowcept import ( FlowceptConsumerAPI, ZambezeInterceptor, @@ -9,7 +7,7 @@ TensorboardInterceptor, ) from flowcept.commons.vocabulary import Vocabulary -from flowcept.configs import SETTINGS_PATH +from flowcept.configs import settings INTERCEPTORS = { @@ -21,12 +19,9 @@ def main(): - with open(SETTINGS_PATH) as f: - yaml_data = yaml.load(f, Loader=yaml.FullLoader) - interceptors = [] - for plugin_key in yaml_data["plugins"]: - plugin_settings_obj = yaml_data["plugins"][plugin_key] + for plugin_key in settings["plugins"]: + plugin_settings_obj = settings["plugins"][plugin_key] if ( "enabled" in plugin_settings_obj and not plugin_settings_obj["enabled"] diff --git a/flowcept/version.py b/flowcept/version.py index 1a4996fc..7b6d60ff 100644 --- a/flowcept/version.py +++ b/flowcept/version.py @@ -2,4 +2,4 @@ # This file is supposed to be automatically modified by the CI Bot. # The expected format is: .. # See .github/workflows/version_bumper.py -__version__ = "0.2.10" +__version__ = "0.3.2" diff --git a/notebooks/analytics.ipynb b/notebooks/analytics.ipynb index 80634791..48a288fa 100644 --- a/notebooks/analytics.ipynb +++ b/notebooks/analytics.ipynb @@ -2,31 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "222b4132-fc10-4503-a108-592d5e742515", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n" - ] - } - ], + "outputs": [], "source": [ "from datetime import datetime\n", "import numpy as np\n", "import pandas as pd\n", "import flowcept.analytics as analytics\n", + "import flowcept.analytics.plot as flow_plot\n", "from flowcept import TaskQueryAPI" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "c7b11fbf-ec74-46e7-9824-4685a9288c55", "metadata": { "tags": [] @@ -61,12 +54,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "176f01c5-5e59-44e3-ad65-409fcfdc2f9b", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'775f6300-3855-48a3-9cef-123ad182afd1'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Need to run only if this is the first time.\n", "wf_id = ingest_mock_data()\n", @@ -75,19 +79,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "96442d46-7ebb-470d-962b-11b65e7aca12", "metadata": { "tags": [] }, "outputs": [], "source": [ - "# wf_id = '100faab4-ff4c-4f78-92a7-6f20ec1fad83'" + "#wf_id = '100faab4-ff4c-4f78-92a7-6f20ec1fad83'" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "e41fe652-d7e8-4e3d-a780-dfec4e5142b0", "metadata": { "tags": [] @@ -107,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "2c3cd6d6-fc22-4155-80e0-da7ffc9f8e0e", "metadata": { "tags": [] @@ -122,12 +126,208 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "d2c04cbe-4b78-49ee-b74d-5e7680a4478f", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
task_idsubmitted_atactivity_idworkflow_idutc_timestampadapter_idusercampaign_idsys_namenode_name...telemetry_diff.network.netio_per_interface.bridge100.bytes_senttelemetry_diff.network.netio_per_interface.bridge100.bytes_recvtelemetry_diff.network.netio_per_interface.bridge100.packets_senttelemetry_diff.network.netio_per_interface.bridge100.packets_recvtelemetry_diff.network.netio_per_interface.bridge100.errintelemetry_diff.network.netio_per_interface.bridge100.errouttelemetry_diff.network.netio_per_interface.bridge100.dropintelemetry_diff.network.netio_per_interface.bridge100.dropoutstatuselapsed_time
00fb0fc93-f421-48db-99ea-6fc2f237646b2024-02-09 01:05:28.202881024wrapper775f6300-3855-48a3-9cef-123ad182afd12024-02-09 01:06:27.422988032daskrootsuper_campaignDarwinMAC132633...0.00.02.00.00.00.00.00.0FINISHED59.133646
1f776846b-fa09-49b9-989c-815104bdcd242024-02-09 01:05:28.206701056wrapper775f6300-3855-48a3-9cef-123ad182afd12024-02-09 01:06:29.350380800daskrootsuper_campaignDarwinMAC132633...0.00.02.00.00.00.00.00.0FINISHED61.062001
2a83fa864-e381-4e52-aca0-90a8a5b54d5d2024-02-09 01:05:28.210365952wrapper775f6300-3855-48a3-9cef-123ad182afd12024-02-09 01:08:17.270892032daskrootsuper_campaignDarwinMAC132633...1024.00.010.00.00.00.00.00.0FINISHED168.981788
\n", + "

3 rows × 334 columns

\n", + "
" + ], + "text/plain": [ + " task_id submitted_at \\\n", + "0 0fb0fc93-f421-48db-99ea-6fc2f237646b 2024-02-09 01:05:28.202881024 \n", + "1 f776846b-fa09-49b9-989c-815104bdcd24 2024-02-09 01:05:28.206701056 \n", + "2 a83fa864-e381-4e52-aca0-90a8a5b54d5d 2024-02-09 01:05:28.210365952 \n", + "\n", + " activity_id workflow_id \\\n", + "0 wrapper 775f6300-3855-48a3-9cef-123ad182afd1 \n", + "1 wrapper 775f6300-3855-48a3-9cef-123ad182afd1 \n", + "2 wrapper 775f6300-3855-48a3-9cef-123ad182afd1 \n", + "\n", + " utc_timestamp adapter_id user campaign_id sys_name \\\n", + "0 2024-02-09 01:06:27.422988032 dask root super_campaign Darwin \n", + "1 2024-02-09 01:06:29.350380800 dask root super_campaign Darwin \n", + "2 2024-02-09 01:08:17.270892032 dask root super_campaign Darwin \n", + "\n", + " node_name ... \\\n", + "0 MAC132633 ... \n", + "1 MAC132633 ... \n", + "2 MAC132633 ... \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_sent \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 1024.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_recv \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_sent \\\n", + "0 2.0 \n", + "1 2.0 \n", + "2 10.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_recv \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.errin \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.errout \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.dropin \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.dropout status \\\n", + "0 0.0 FINISHED \n", + "1 0.0 FINISHED \n", + "2 0.0 FINISHED \n", + "\n", + " elapsed_time \n", + "0 59.133646 \n", + "1 61.062001 \n", + "2 168.981788 \n", + "\n", + "[3 rows x 334 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df.head(3)" ] @@ -142,12 +342,290 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "8a8c1dd7-9647-4e7a-82e3-f7db7752f824", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of columns originally: 334\n", + "Number of columns later: 39\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
used.max_epochsgenerated.lossgenerated.accuracygenerated.responsible_ai_metadata.shap_sumgenerated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.paramsgenerated.responsible_ai_metadata.max_widthgenerated.responsible_ai_metadata.depthgenerated.responsible_ai_metadata.n_fc_layersgenerated.responsible_ai_metadata.n_cv_layers...telemetry_diff.memory.swap.souttelemetry_diff.disk.disk_usage.freeused.conv_in_outs_sumused.conv_kernel_sizes_sumused.conv_pool_sizes_sumused.fc_in_outs_sumused.softmax_dims_sumtelemetry_diff.network.activitytelemetry_diff.disk.activitytelemetry_diff.process.activity
01.00.01472940.750.02.188019e+07162990.0100.012.05.07.0...5390336.0-1.067229e+0941.029.02.0220.01.0156472.43751.714730e+081997778.0
11.00.04032611.350.04.727514e+07359840.0400.016.09.07.0...5390336.0-1.067397e+0941.029.02.01620.03.0162635.81251.724063e+082044184.0
21.00.05815711.350.05.405073e+0942184840.04000.024.017.07.0...14172160.0-1.065861e+0941.029.02.032020.07.0369630.81252.518569e+084531840.0
31.00.01824210.280.03.241957e+081890690.0100.016.05.011.0...21512192.0-1.069761e+09181.030.03.0260.01.0650028.62502.726195e+086284750.0
41.00.04031211.350.03.498467e+082089540.0400.020.09.011.0...22134784.0-1.070207e+09181.030.03.01660.03.0652738.75002.752950e+086311004.0
\n", + "

5 rows × 39 columns

\n", + "
" + ], + "text/plain": [ + " used.max_epochs generated.loss generated.accuracy \\\n", + "0 1.0 0.014729 40.75 \n", + "1 1.0 0.040326 11.35 \n", + "2 1.0 0.058157 11.35 \n", + "3 1.0 0.018242 10.28 \n", + "4 1.0 0.040312 11.35 \n", + "\n", + " generated.responsible_ai_metadata.shap_sum \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 0.0 \n", + "4 0.0 \n", + "\n", + " generated.responsible_ai_metadata.flops \\\n", + "0 2.188019e+07 \n", + "1 4.727514e+07 \n", + "2 5.405073e+09 \n", + "3 3.241957e+08 \n", + "4 3.498467e+08 \n", + "\n", + " generated.responsible_ai_metadata.params \\\n", + "0 162990.0 \n", + "1 359840.0 \n", + "2 42184840.0 \n", + "3 1890690.0 \n", + "4 2089540.0 \n", + "\n", + " generated.responsible_ai_metadata.max_width \\\n", + "0 100.0 \n", + "1 400.0 \n", + "2 4000.0 \n", + "3 100.0 \n", + "4 400.0 \n", + "\n", + " generated.responsible_ai_metadata.depth \\\n", + "0 12.0 \n", + "1 16.0 \n", + "2 24.0 \n", + "3 16.0 \n", + "4 20.0 \n", + "\n", + " generated.responsible_ai_metadata.n_fc_layers \\\n", + "0 5.0 \n", + "1 9.0 \n", + "2 17.0 \n", + "3 5.0 \n", + "4 9.0 \n", + "\n", + " generated.responsible_ai_metadata.n_cv_layers ... \\\n", + "0 7.0 ... \n", + "1 7.0 ... \n", + "2 7.0 ... \n", + "3 11.0 ... \n", + "4 11.0 ... \n", + "\n", + " telemetry_diff.memory.swap.sout telemetry_diff.disk.disk_usage.free \\\n", + "0 5390336.0 -1.067229e+09 \n", + "1 5390336.0 -1.067397e+09 \n", + "2 14172160.0 -1.065861e+09 \n", + "3 21512192.0 -1.069761e+09 \n", + "4 22134784.0 -1.070207e+09 \n", + "\n", + " used.conv_in_outs_sum used.conv_kernel_sizes_sum \\\n", + "0 41.0 29.0 \n", + "1 41.0 29.0 \n", + "2 41.0 29.0 \n", + "3 181.0 30.0 \n", + "4 181.0 30.0 \n", + "\n", + " used.conv_pool_sizes_sum used.fc_in_outs_sum used.softmax_dims_sum \\\n", + "0 2.0 220.0 1.0 \n", + "1 2.0 1620.0 3.0 \n", + "2 2.0 32020.0 7.0 \n", + "3 3.0 260.0 1.0 \n", + "4 3.0 1660.0 3.0 \n", + "\n", + " telemetry_diff.network.activity telemetry_diff.disk.activity \\\n", + "0 156472.4375 1.714730e+08 \n", + "1 162635.8125 1.724063e+08 \n", + "2 369630.8125 2.518569e+08 \n", + "3 650028.6250 2.726195e+08 \n", + "4 652738.7500 2.752950e+08 \n", + "\n", + " telemetry_diff.process.activity \n", + "0 1997778.0 \n", + "1 2044184.0 \n", + "2 4531840.0 \n", + "3 6284750.0 \n", + "4 6311004.0 \n", + "\n", + "[5 rows x 39 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cleaned_df = analytics.clean_dataframe(\n", " df,\n", @@ -162,16 +640,188 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "5497b4c8-ba90-4ae4-82d7-0ef821fe2f4f", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
used.conv_in_outsused.conv_kernel_sizesused.conv_pool_sizesused.fc_in_outsused.softmax_dimsused.max_epochsgenerated.lossgenerated.accuracygenerated.responsible_ai_metadata.shap_sumgenerated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.paramsgenerated.responsible_ai_metadata.max_widthgenerated.responsible_ai_metadata.depthgenerated.responsible_ai_metadata.n_fc_layersgenerated.responsible_ai_metadata.n_cv_layersgenerated.responsible_ai_metadata.convolutional_layersgenerated.responsible_ai_metadata.fully_connected_layers
0[[1, 10], [10, 20]][1, 28][1, 1][[20, 50], [50, 100]][None, 1]10.01472940.750.02.188019e+07162990.0100.012.05.07.0Sequential(\\n (0): Conv2d(1, 10, kernel_size=...Sequential(\\n (0): Linear(in_features=20, out...
6[[1, 30], [30, 60], [60, 90], [90, 120]][1, 1, 1, 28][1, 1, 1, 1][[120, 50], [50, 100]][None, 1]10.01820810.090.01.810793e+098485880.0120.020.05.015.0Sequential(\\n (0): Conv2d(1, 30, kernel_size=...Sequential(\\n (0): Linear(in_features=120, ou...
3[[1, 20], [20, 40], [40, 60]][1, 1, 28][1, 1, 1][[60, 50], [50, 100]][None, 1]10.01824210.280.03.241957e+081890690.0100.016.05.011.0Sequential(\\n (0): Conv2d(1, 20, kernel_size=...Sequential(\\n (0): Linear(in_features=60, out...
\n", + "
" + ], + "text/plain": [ + " used.conv_in_outs used.conv_kernel_sizes \\\n", + "0 [[1, 10], [10, 20]] [1, 28] \n", + "6 [[1, 30], [30, 60], [60, 90], [90, 120]] [1, 1, 1, 28] \n", + "3 [[1, 20], [20, 40], [40, 60]] [1, 1, 28] \n", + "\n", + " used.conv_pool_sizes used.fc_in_outs used.softmax_dims \\\n", + "0 [1, 1] [[20, 50], [50, 100]] [None, 1] \n", + "6 [1, 1, 1, 1] [[120, 50], [50, 100]] [None, 1] \n", + "3 [1, 1, 1] [[60, 50], [50, 100]] [None, 1] \n", + "\n", + " used.max_epochs generated.loss generated.accuracy \\\n", + "0 1 0.014729 40.75 \n", + "6 1 0.018208 10.09 \n", + "3 1 0.018242 10.28 \n", + "\n", + " generated.responsible_ai_metadata.shap_sum \\\n", + "0 0.0 \n", + "6 0.0 \n", + "3 0.0 \n", + "\n", + " generated.responsible_ai_metadata.flops \\\n", + "0 2.188019e+07 \n", + "6 1.810793e+09 \n", + "3 3.241957e+08 \n", + "\n", + " generated.responsible_ai_metadata.params \\\n", + "0 162990.0 \n", + "6 8485880.0 \n", + "3 1890690.0 \n", + "\n", + " generated.responsible_ai_metadata.max_width \\\n", + "0 100.0 \n", + "6 120.0 \n", + "3 100.0 \n", + "\n", + " generated.responsible_ai_metadata.depth \\\n", + "0 12.0 \n", + "6 20.0 \n", + "3 16.0 \n", + "\n", + " generated.responsible_ai_metadata.n_fc_layers \\\n", + "0 5.0 \n", + "6 5.0 \n", + "3 5.0 \n", + "\n", + " generated.responsible_ai_metadata.n_cv_layers \\\n", + "0 7.0 \n", + "6 15.0 \n", + "3 11.0 \n", + "\n", + " generated.responsible_ai_metadata.convolutional_layers \\\n", + "0 Sequential(\\n (0): Conv2d(1, 10, kernel_size=... \n", + "6 Sequential(\\n (0): Conv2d(1, 30, kernel_size=... \n", + "3 Sequential(\\n (0): Conv2d(1, 20, kernel_size=... \n", + "\n", + " generated.responsible_ai_metadata.fully_connected_layers \n", + "0 Sequential(\\n (0): Linear(in_features=20, out... \n", + "6 Sequential(\\n (0): Linear(in_features=120, ou... \n", + "3 Sequential(\\n (0): Linear(in_features=60, out... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "sort = [\n", " (\"generated.loss\", TaskQueryAPI.ASC),\n", - " (\"generated.responsible_ai_metrics.params\", TaskQueryAPI.ASC),\n", + " (\"generated.responsible_ai_metadata.params\", TaskQueryAPI.ASC),\n", "]\n", "df = query_api.df_get_top_k_tasks(\n", " filter=_filter,\n", @@ -196,12 +846,283 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "c669ac40-60b4-49e0-ae62-a2cda2c5815a", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of columns originally: 334\n", + "Number of columns later: 58\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
used.max_epochsgenerated.lossgenerated.accuracygenerated.responsible_ai_metadata.shap_sumgenerated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.paramsgenerated.responsible_ai_metadata.max_widthgenerated.responsible_ai_metadata.depthgenerated.responsible_ai_metadata.n_fc_layersgenerated.responsible_ai_metadata.n_cv_layers...telemetry_diff.network.netio_per_interface.en0.bytes_senttelemetry_diff.network.netio_per_interface.en0.packets_senttelemetry_diff.network.netio_per_interface.utun4.bytes_senttelemetry_diff.network.netio_per_interface.utun4.bytes_recvtelemetry_diff.network.netio_per_interface.utun4.packets_senttelemetry_diff.network.netio_per_interface.utun4.packets_recvtelemetry_diff.network.netio_per_interface.vmenet0.bytes_senttelemetry_diff.network.netio_per_interface.vmenet0.packets_senttelemetry_diff.network.netio_per_interface.bridge100.bytes_senttelemetry_diff.network.netio_per_interface.bridge100.packets_sent
01.00.01472940.750.02.188019e+07162990.0100.012.05.07.0...243712.0534.0199680.0205824.0507.0780.00.01.00.02.0
11.00.04032611.350.04.727514e+07359840.0400.016.09.07.0...245760.0546.0200704.0208896.0519.0806.00.01.00.02.0
21.00.05815711.350.05.405073e+0942184840.04000.024.017.07.0...626688.01355.0514048.0493568.01288.01960.00.05.01024.010.0
31.00.01824210.280.03.241957e+081890690.0100.016.05.011.0...1671168.02556.0812032.0799744.01994.03078.01024.010.02048.020.0
\n", + "

4 rows × 58 columns

\n", + "
" + ], + "text/plain": [ + " used.max_epochs generated.loss generated.accuracy \\\n", + "0 1.0 0.014729 40.75 \n", + "1 1.0 0.040326 11.35 \n", + "2 1.0 0.058157 11.35 \n", + "3 1.0 0.018242 10.28 \n", + "\n", + " generated.responsible_ai_metadata.shap_sum \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 0.0 \n", + "\n", + " generated.responsible_ai_metadata.flops \\\n", + "0 2.188019e+07 \n", + "1 4.727514e+07 \n", + "2 5.405073e+09 \n", + "3 3.241957e+08 \n", + "\n", + " generated.responsible_ai_metadata.params \\\n", + "0 162990.0 \n", + "1 359840.0 \n", + "2 42184840.0 \n", + "3 1890690.0 \n", + "\n", + " generated.responsible_ai_metadata.max_width \\\n", + "0 100.0 \n", + "1 400.0 \n", + "2 4000.0 \n", + "3 100.0 \n", + "\n", + " generated.responsible_ai_metadata.depth \\\n", + "0 12.0 \n", + "1 16.0 \n", + "2 24.0 \n", + "3 16.0 \n", + "\n", + " generated.responsible_ai_metadata.n_fc_layers \\\n", + "0 5.0 \n", + "1 9.0 \n", + "2 17.0 \n", + "3 5.0 \n", + "\n", + " generated.responsible_ai_metadata.n_cv_layers ... \\\n", + "0 7.0 ... \n", + "1 7.0 ... \n", + "2 7.0 ... \n", + "3 11.0 ... \n", + "\n", + " telemetry_diff.network.netio_per_interface.en0.bytes_sent \\\n", + "0 243712.0 \n", + "1 245760.0 \n", + "2 626688.0 \n", + "3 1671168.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.en0.packets_sent \\\n", + "0 534.0 \n", + "1 546.0 \n", + "2 1355.0 \n", + "3 2556.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.bytes_sent \\\n", + "0 199680.0 \n", + "1 200704.0 \n", + "2 514048.0 \n", + "3 812032.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.bytes_recv \\\n", + "0 205824.0 \n", + "1 208896.0 \n", + "2 493568.0 \n", + "3 799744.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.packets_sent \\\n", + "0 507.0 \n", + "1 519.0 \n", + "2 1288.0 \n", + "3 1994.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.packets_recv \\\n", + "0 780.0 \n", + "1 806.0 \n", + "2 1960.0 \n", + "3 3078.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.vmenet0.bytes_sent \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 0.0 \n", + "3 1024.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.vmenet0.packets_sent \\\n", + "0 1.0 \n", + "1 1.0 \n", + "2 5.0 \n", + "3 10.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_sent \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 1024.0 \n", + "3 2048.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_sent \n", + "0 2.0 \n", + "1 2.0 \n", + "2 10.0 \n", + "3 20.0 \n", + "\n", + "[4 rows x 58 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "clauses = [\n", " (\"telemetry_diff.process.cpu_times.user\", \"<\", 0.5),\n", @@ -209,7 +1130,7 @@ "sort = [\n", " (\"telemetry_diff.process.cpu_times.user\", TaskQueryAPI.ASC),\n", " (\"generated.loss\", TaskQueryAPI.ASC),\n", - " (\"generated.responsible_ai_metrics.flops\", TaskQueryAPI.ASC),\n", + " (\"generated.responsible_ai_metadata.flops\", TaskQueryAPI.ASC),\n", "]\n", "df = query_api.df_get_tasks_quantiles(\n", " clauses=clauses,\n", @@ -243,12 +1164,2723 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "066717e4-2110-4d62-aedd-005c1198cefa", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
used.max_epochsgenerated.lossgenerated.accuracygenerated.responsible_ai_metadata.shap_sumgenerated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.paramsgenerated.responsible_ai_metadata.max_widthgenerated.responsible_ai_metadata.depthgenerated.responsible_ai_metadata.n_fc_layersgenerated.responsible_ai_metadata.n_cv_layers...telemetry_diff.network.netio_per_interface.en0.bytes_senttelemetry_diff.network.netio_per_interface.en0.packets_senttelemetry_diff.network.netio_per_interface.utun4.bytes_senttelemetry_diff.network.netio_per_interface.utun4.bytes_recvtelemetry_diff.network.netio_per_interface.utun4.packets_senttelemetry_diff.network.netio_per_interface.utun4.packets_recvtelemetry_diff.network.netio_per_interface.vmenet0.bytes_senttelemetry_diff.network.netio_per_interface.vmenet0.packets_senttelemetry_diff.network.netio_per_interface.bridge100.bytes_senttelemetry_diff.network.netio_per_interface.bridge100.packets_sent
used.max_epochsNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
generated.lossNaN1.000000-0.570400NaN0.8198080.8234720.8688190.8961289.669773e-01-0.479819...-0.271887-0.149934-0.055562-0.080247-0.043729-0.053281-0.479819-0.116829-6.767772e-02-0.116829
generated.accuracyNaN-0.5704001.000000NaN-0.345728-0.338603-0.349589-0.649192-4.485456e-01-0.365087...-0.477162-0.525894-0.551055-0.546526-0.557710-0.557186-0.365087-0.533059-5.469569e-01-0.533059
generated.responsible_ai_metadata.shap_sumNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
generated.responsible_ai_metadata.flopsNaN0.819808-0.345728NaN1.0000000.9998930.9942330.9368849.340567e-01-0.284137...-0.0176970.1265000.2377110.2078000.2479570.235496-0.2841370.1682332.247585e-010.168233
generated.responsible_ai_metadata.paramsNaN0.823472-0.338603NaN0.9998931.0000000.9954200.9347359.370909e-01-0.298127...-0.0323160.1119810.2234820.1934740.2337640.221259-0.2981270.1538002.104857e-010.153800
generated.responsible_ai_metadata.max_widthNaN0.868819-0.349589NaN0.9942330.9954201.0000000.9385199.649505e-01-0.367405...-0.1061280.0381370.1502850.1201290.1610270.148537-0.3674050.0798601.370506e-010.079860
generated.responsible_ai_metadata.depthNaN0.896128-0.649192NaN0.9368840.9347350.9385191.0000009.365858e-01-0.132453...0.1229450.2580130.3580050.3319350.3689810.358651-0.1324530.2945473.458572e-010.294547
generated.responsible_ai_metadata.n_fc_layersNaN0.966977-0.448546NaN0.9340570.9370910.9649510.9365861.000000e+00-0.471405...-0.231315-0.0939790.013152-0.0153650.0248210.013332-0.471405-0.0551741.639908e-16-0.055174
generated.responsible_ai_metadata.n_cv_layersNaN-0.479819-0.365087NaN-0.284137-0.298127-0.367405-0.132453-4.714045e-011.000000...0.9636620.9151320.8637580.8788080.8583770.8648761.0000000.8973158.703883e-010.897315
telemetry_diff.cpu.times_avg.userNaN-0.035758-0.560502NaN0.2562440.2420820.1695310.3768313.337242e-020.853946...0.9619080.9912580.9997950.9987530.9999630.9997700.8539460.9959139.994417e-010.995913
telemetry_diff.cpu.times_avg.systemNaN0.004163-0.569578NaN0.3009530.2869760.2151230.4168647.788061e-020.828804...0.9481460.9840450.9978220.9953540.9984810.9976900.8288040.9906479.968501e-010.990647
telemetry_diff.cpu.times_avg.idleNaN-0.201370-0.507239NaN0.0660490.051451-0.0225270.201962-1.519078e-010.937919...0.9964880.9981550.9849100.9897600.9830310.9852950.9379190.9946969.871205e-010.994696
telemetry_diff.process.memory.rssNaN-0.2868020.642277NaN-0.569155-0.557103-0.496968-0.667256-3.729260e-01-0.624431...-0.809753-0.885564-0.931697-0.920466-0.935748-0.931360-0.624431-0.903897-9.267632e-01-0.903897
telemetry_diff.process.memory.vmsNaN-0.5737170.451121NaN-0.893210-0.886669-0.843689-0.870138-7.144685e-01-0.168978...-0.425057-0.550086-0.640690-0.616711-0.648229-0.638209-0.168978-0.585088-6.305982e-01-0.585088
telemetry_diff.process.memory.pfaultsNaN0.026389-0.574134NaN0.3255360.3116750.2402800.4387541.025762e-010.814044...0.9396030.9791110.9957890.9925300.9967200.9955980.8140440.9867899.944736e-010.986789
telemetry_diff.process.memory.pageinsNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
telemetry_diff.process.cpu_times.userNaN-0.034090-0.561064NaN0.2579910.2438350.1713230.3784753.516914e-020.853002...0.9614110.9910180.9997570.9986610.9999450.9997300.8530020.9957479.993796e-010.995747
telemetry_diff.process.cpu_times.systemNaN0.018441-0.573210NaN0.3162300.3023240.2308070.4307839.348204e-020.819705...0.9429140.9810580.9966330.9936770.9974650.9964720.8197050.9883249.954462e-010.988324
telemetry_diff.process.num_open_file_descriptorsNaN0.595114-0.999426NaN0.3604640.3537580.3674050.6622664.714045e-010.333333...0.4481560.4992740.5266250.5214900.5335600.5327930.3333330.5071785.222330e-010.507178
telemetry_diff.process.num_connectionsNaN0.595114-0.999426NaN0.3604640.3537580.3674050.6622664.714045e-010.333333...0.4481560.4992740.5266250.5214900.5335600.5327930.3333330.5071785.222330e-010.507178
telemetry_diff.process.num_open_filesNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
telemetry_diff.process.num_threadsNaN0.4798190.365087NaN0.2841370.2981270.3674050.1324534.714045e-01-1.000000...-0.963662-0.915132-0.863758-0.878808-0.858377-0.864876-1.000000-0.897315-8.703883e-01-0.897315
telemetry_diff.process.num_ctx_switches.voluntaryNaN0.013872-0.572264NaN0.3111860.2972550.2256440.4262868.840923e-020.822737...0.9446700.9820730.9970530.9942590.9978290.9969040.8227370.9891189.959365e-010.989118
telemetry_diff.memory.virtual.availableNaN0.650383-0.268278NaN0.9661330.9634500.9335370.8695608.108192e-01-0.104999...0.1596490.2969410.4015160.3732390.4099410.397912-0.1049990.3371583.898045e-010.337158
telemetry_diff.memory.virtual.usedNaN-0.8433800.195404NaN-0.969549-0.973005-0.983837-0.865558-9.500208e-010.508791...0.2604600.1188280.0058690.036619-0.0045410.0083700.5087910.0767071.913862e-020.076707
telemetry_diff.memory.virtual.freeNaN0.762274-0.206719NaN0.9894890.9903490.9818220.8765729.016455e-01-0.344248...-0.0833290.0594400.1713720.1409230.1809820.168082-0.3442480.1018261.585301e-010.101826
telemetry_diff.memory.virtual.activeNaN-0.797255-0.012427NaN-0.849813-0.857370-0.887187-0.701887-8.871182e-010.742773...0.5378270.4113870.3058190.3350190.2961260.3085190.7427730.3723203.183437e-010.372320
telemetry_diff.memory.virtual.inactiveNaN-0.492605-0.234913NaN-0.163899-0.177951-0.261248-0.088462-4.214716e-010.969478...0.9653010.9333580.8961680.9069740.8908400.8952380.9694780.9216799.015499e-010.921679
telemetry_diff.memory.virtual.wiredNaN-0.4429960.664942NaN-0.699543-0.689120-0.638971-0.786457-5.302289e-01-0.479494...-0.694941-0.790574-0.853364-0.837588-0.859256-0.853010-0.479494-0.814837-8.463404e-01-0.814837
telemetry_diff.memory.swap.totalNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
telemetry_diff.memory.swap.usedNaN-0.0735440.576533NaN-0.381632-0.368075-0.297423-0.485662-1.571348e-01-0.777778...-0.917412-0.965147-0.988536-0.983428-0.990051-0.988140-0.777778-0.975343-9.864401e-01-0.975343
telemetry_diff.memory.swap.freeNaN0.073544-0.576533NaN0.3816320.3680750.2974230.4856621.571348e-010.777778...0.9174120.9651470.9885360.9834280.9900510.9881400.7777780.9753439.864401e-010.975343
telemetry_diff.memory.swap.sinNaN0.211144-0.592704NaN0.5249520.5124500.4465460.6105183.074307e-010.666893...0.8417080.9106950.9515220.9416350.9547070.9507920.6668930.9273149.473410e-010.927314
telemetry_diff.memory.swap.soutNaN-0.028649-0.556661NaN0.2689310.2548180.1819550.3856204.363225e-020.847046...0.9582460.9894260.9994780.9980080.9997400.9993550.8470460.9946759.989610e-010.994675
telemetry_diff.disk.disk_usage.freeNaN0.7130560.167844NaN0.6623850.6732510.7221270.5021207.668184e-01-0.905250...-0.759478-0.658216-0.568944-0.594005-0.560470-0.571158-0.905250-0.625691-5.797646e-01-0.625691
telemetry_diff.disk.io_sum.read_countNaN0.189411-0.593114NaN0.5014970.4887920.4221150.5911942.831263e-010.687004...0.8561460.9216480.9595680.9504850.9624880.9589150.6870040.9371899.557312e-010.937189
telemetry_diff.disk.io_sum.write_countNaN-0.053648-0.574445NaN0.2195640.2052830.1340150.3526325.305484e-030.872431...0.9709710.9950590.9992270.9994280.9991490.9995190.8724310.9979829.993365e-010.997982
telemetry_diff.disk.io_sum.read_bytesNaN0.200516-0.592808NaN0.5136140.5010120.4347150.6011332.956057e-010.676720...0.8487970.9160980.9555180.9460200.9585740.9548240.6767200.9321969.515041e-010.932196
telemetry_diff.disk.io_sum.write_bytesNaN-0.041367-0.576577NaN0.2345410.2203070.1491050.3656321.954089e-020.864883...0.9672710.9935400.9994520.9991760.9995270.9996950.8648830.9971199.993589e-010.997119
telemetry_diff.disk.io_sum.read_timeNaN0.122188-0.588540NaN0.4298280.4165790.3476650.5300982.087714e-010.743555...0.8951520.9500290.9791910.9725170.9812930.9787360.7435550.9623329.763949e-010.962332
telemetry_diff.disk.io_sum.write_timeNaN-0.022095-0.570804NaN0.2656040.2514790.1796990.3885574.564447e-020.848745...0.9590940.9898500.9994390.9981320.9997660.9994770.8487450.9948579.989421e-010.994857
telemetry_diff.network.netio_sum.bytes_sentNaN-0.151213-0.528206NaN0.1223810.1078550.0342620.255617-9.669159e-020.916774...0.9901320.9999820.9930910.9962350.9918300.9933900.9167740.9988809.945481e-010.998880
telemetry_diff.network.netio_sum.bytes_recvNaN-0.042983-0.565808NaN0.2419290.2277160.1556250.3673182.226364e-020.861425...0.9657210.9930140.9998420.9992860.9999110.9999380.8614250.9969939.996702e-010.996993
telemetry_diff.network.netio_sum.packets_sentNaN-0.065661-0.554730NaN0.2207150.2064290.1336090.345677-8.667188e-040.872387...0.9712410.9954090.9998030.9998920.9995990.9998840.8723870.9985119.999324e-010.998511
telemetry_diff.network.netio_sum.packets_recvNaN-0.038843-0.563210NaN0.2497810.2355950.1632710.3726582.845319e-020.857359...0.9636680.9920900.9998530.9990320.9999780.9998850.8573590.9964389.995813e-010.996438
telemetry_diff.network.netio_per_interface.lo0.bytes_sentNaN-0.017335-0.578592NaN0.2651850.2510620.1798930.3913324.810721e-020.848764...0.9589990.9897280.9992320.9979670.9996080.9993530.8487640.9946659.987263e-010.994665
telemetry_diff.network.netio_per_interface.lo0.packets_sentNaN-0.030336-0.566697NaN0.2581660.2440120.1719300.3808673.735422e-020.852840...0.9612920.9909480.9996810.9986000.9999090.9997100.8528400.9956489.992907e-010.995648
telemetry_diff.network.netio_per_interface.en0.bytes_sentNaN-0.271887-0.477162NaN-0.017697-0.032316-0.1061280.122945-2.313148e-010.963662...1.0000000.9895670.9669760.9743380.9642200.9675270.9636620.9826149.702818e-010.982614
telemetry_diff.network.netio_per_interface.en0.packets_sentNaN-0.149934-0.525894NaN0.1265000.1119810.0381370.258013-9.397918e-020.915132...0.9895671.0000000.9935950.9966000.9923540.9938490.9151320.9990969.950035e-010.999096
telemetry_diff.network.netio_per_interface.utun4.bytes_sentNaN-0.055562-0.551055NaN0.2377110.2234820.1502850.3580051.315250e-020.863758...0.9669760.9935951.0000000.9995240.9999300.9999630.8637580.9974829.999104e-010.997482
telemetry_diff.network.netio_per_interface.utun4.bytes_recvNaN-0.080247-0.546526NaN0.2078000.1934740.1201290.331935-1.536456e-020.878808...0.9743380.9966000.9995241.0000000.9991470.9995830.8788080.9991799.998390e-010.999179
telemetry_diff.network.netio_per_interface.utun4.packets_sentNaN-0.043729-0.557710NaN0.2479570.2337640.1610270.3689812.482132e-020.858377...0.9642200.9923540.9999300.9991471.0000000.9999140.8583770.9966569.996919e-010.996656
telemetry_diff.network.netio_per_interface.utun4.packets_recvNaN-0.053281-0.557186NaN0.2354960.2212590.1485370.3586511.333218e-020.864876...0.9675270.9938490.9999630.9995830.9999141.0000000.8648760.9975979.998925e-010.997597
telemetry_diff.network.netio_per_interface.vmenet0.bytes_sentNaN-0.479819-0.365087NaN-0.284137-0.298127-0.367405-0.132453-4.714045e-011.000000...0.9636620.9151320.8637580.8788080.8583770.8648761.0000000.8973158.703883e-010.897315
telemetry_diff.network.netio_per_interface.vmenet0.packets_sentNaN-0.116829-0.533059NaN0.1682330.1538000.0798600.294547-5.517373e-020.897315...0.9826140.9990960.9974820.9991790.9966560.9975970.8973151.0000009.983382e-011.000000
telemetry_diff.network.netio_per_interface.bridge100.bytes_sentNaN-0.067678-0.546957NaN0.2247590.2104860.1370510.3458571.639908e-160.870388...0.9702820.9950030.9999100.9998390.9996920.9998930.8703880.9983381.000000e+000.998338
telemetry_diff.network.netio_per_interface.bridge100.packets_sentNaN-0.116829-0.533059NaN0.1682330.1538000.0798600.294547-5.517373e-020.897315...0.9826140.9990960.9974820.9991790.9966560.9975970.8973151.0000009.983382e-011.000000
\n", + "

58 rows × 58 columns

\n", + "
" + ], + "text/plain": [ + " used.max_epochs \\\n", + "used.max_epochs NaN \n", + "generated.loss NaN \n", + "generated.accuracy NaN \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops NaN \n", + "generated.responsible_ai_metadata.params NaN \n", + "generated.responsible_ai_metadata.max_width NaN \n", + "generated.responsible_ai_metadata.depth NaN \n", + "generated.responsible_ai_metadata.n_fc_layers NaN \n", + "generated.responsible_ai_metadata.n_cv_layers NaN \n", + "telemetry_diff.cpu.times_avg.user NaN \n", + "telemetry_diff.cpu.times_avg.system NaN \n", + "telemetry_diff.cpu.times_avg.idle NaN \n", + "telemetry_diff.process.memory.rss NaN \n", + "telemetry_diff.process.memory.vms NaN \n", + "telemetry_diff.process.memory.pfaults NaN \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user NaN \n", + "telemetry_diff.process.cpu_times.system NaN \n", + "telemetry_diff.process.num_open_file_descriptors NaN \n", + "telemetry_diff.process.num_connections NaN \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads NaN \n", + "telemetry_diff.process.num_ctx_switches.voluntary NaN \n", + "telemetry_diff.memory.virtual.available NaN \n", + "telemetry_diff.memory.virtual.used NaN \n", + "telemetry_diff.memory.virtual.free NaN \n", + "telemetry_diff.memory.virtual.active NaN \n", + "telemetry_diff.memory.virtual.inactive NaN \n", + "telemetry_diff.memory.virtual.wired NaN \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used NaN \n", + "telemetry_diff.memory.swap.free NaN \n", + "telemetry_diff.memory.swap.sin NaN \n", + "telemetry_diff.memory.swap.sout NaN \n", + "telemetry_diff.disk.disk_usage.free NaN \n", + "telemetry_diff.disk.io_sum.read_count NaN \n", + "telemetry_diff.disk.io_sum.write_count NaN \n", + "telemetry_diff.disk.io_sum.read_bytes NaN \n", + "telemetry_diff.disk.io_sum.write_bytes NaN \n", + "telemetry_diff.disk.io_sum.read_time NaN \n", + "telemetry_diff.disk.io_sum.write_time NaN \n", + "telemetry_diff.network.netio_sum.bytes_sent NaN \n", + "telemetry_diff.network.netio_sum.bytes_recv NaN \n", + "telemetry_diff.network.netio_sum.packets_sent NaN \n", + "telemetry_diff.network.netio_sum.packets_recv NaN \n", + "telemetry_diff.network.netio_per_interface.lo0.... NaN \n", + "telemetry_diff.network.netio_per_interface.lo0.... NaN \n", + "telemetry_diff.network.netio_per_interface.en0.... NaN \n", + "telemetry_diff.network.netio_per_interface.en0.... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.vmen... NaN \n", + "telemetry_diff.network.netio_per_interface.vmen... NaN \n", + "telemetry_diff.network.netio_per_interface.brid... NaN \n", + "telemetry_diff.network.netio_per_interface.brid... NaN \n", + "\n", + " generated.loss \\\n", + "used.max_epochs NaN \n", + "generated.loss 1.000000 \n", + "generated.accuracy -0.570400 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.819808 \n", + "generated.responsible_ai_metadata.params 0.823472 \n", + "generated.responsible_ai_metadata.max_width 0.868819 \n", + "generated.responsible_ai_metadata.depth 0.896128 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.966977 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.479819 \n", + "telemetry_diff.cpu.times_avg.user -0.035758 \n", + "telemetry_diff.cpu.times_avg.system 0.004163 \n", + "telemetry_diff.cpu.times_avg.idle -0.201370 \n", + "telemetry_diff.process.memory.rss -0.286802 \n", + "telemetry_diff.process.memory.vms -0.573717 \n", + "telemetry_diff.process.memory.pfaults 0.026389 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user -0.034090 \n", + "telemetry_diff.process.cpu_times.system 0.018441 \n", + "telemetry_diff.process.num_open_file_descriptors 0.595114 \n", + "telemetry_diff.process.num_connections 0.595114 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.479819 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.013872 \n", + "telemetry_diff.memory.virtual.available 0.650383 \n", + "telemetry_diff.memory.virtual.used -0.843380 \n", + "telemetry_diff.memory.virtual.free 0.762274 \n", + "telemetry_diff.memory.virtual.active -0.797255 \n", + "telemetry_diff.memory.virtual.inactive -0.492605 \n", + "telemetry_diff.memory.virtual.wired -0.442996 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.073544 \n", + "telemetry_diff.memory.swap.free 0.073544 \n", + "telemetry_diff.memory.swap.sin 0.211144 \n", + "telemetry_diff.memory.swap.sout -0.028649 \n", + "telemetry_diff.disk.disk_usage.free 0.713056 \n", + "telemetry_diff.disk.io_sum.read_count 0.189411 \n", + "telemetry_diff.disk.io_sum.write_count -0.053648 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.200516 \n", + "telemetry_diff.disk.io_sum.write_bytes -0.041367 \n", + "telemetry_diff.disk.io_sum.read_time 0.122188 \n", + "telemetry_diff.disk.io_sum.write_time -0.022095 \n", + "telemetry_diff.network.netio_sum.bytes_sent -0.151213 \n", + "telemetry_diff.network.netio_sum.bytes_recv -0.042983 \n", + "telemetry_diff.network.netio_sum.packets_sent -0.065661 \n", + "telemetry_diff.network.netio_sum.packets_recv -0.038843 \n", + "telemetry_diff.network.netio_per_interface.lo0.... -0.017335 \n", + "telemetry_diff.network.netio_per_interface.lo0.... -0.030336 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.271887 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.149934 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.055562 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.080247 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.043729 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.053281 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.479819 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.116829 \n", + "telemetry_diff.network.netio_per_interface.brid... -0.067678 \n", + "telemetry_diff.network.netio_per_interface.brid... -0.116829 \n", + "\n", + " generated.accuracy \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.570400 \n", + "generated.accuracy 1.000000 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops -0.345728 \n", + "generated.responsible_ai_metadata.params -0.338603 \n", + "generated.responsible_ai_metadata.max_width -0.349589 \n", + "generated.responsible_ai_metadata.depth -0.649192 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.448546 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.365087 \n", + "telemetry_diff.cpu.times_avg.user -0.560502 \n", + "telemetry_diff.cpu.times_avg.system -0.569578 \n", + "telemetry_diff.cpu.times_avg.idle -0.507239 \n", + "telemetry_diff.process.memory.rss 0.642277 \n", + "telemetry_diff.process.memory.vms 0.451121 \n", + "telemetry_diff.process.memory.pfaults -0.574134 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user -0.561064 \n", + "telemetry_diff.process.cpu_times.system -0.573210 \n", + "telemetry_diff.process.num_open_file_descriptors -0.999426 \n", + "telemetry_diff.process.num_connections -0.999426 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.365087 \n", + "telemetry_diff.process.num_ctx_switches.voluntary -0.572264 \n", + "telemetry_diff.memory.virtual.available -0.268278 \n", + "telemetry_diff.memory.virtual.used 0.195404 \n", + "telemetry_diff.memory.virtual.free -0.206719 \n", + "telemetry_diff.memory.virtual.active -0.012427 \n", + "telemetry_diff.memory.virtual.inactive -0.234913 \n", + "telemetry_diff.memory.virtual.wired 0.664942 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used 0.576533 \n", + "telemetry_diff.memory.swap.free -0.576533 \n", + "telemetry_diff.memory.swap.sin -0.592704 \n", + "telemetry_diff.memory.swap.sout -0.556661 \n", + "telemetry_diff.disk.disk_usage.free 0.167844 \n", + "telemetry_diff.disk.io_sum.read_count -0.593114 \n", + "telemetry_diff.disk.io_sum.write_count -0.574445 \n", + "telemetry_diff.disk.io_sum.read_bytes -0.592808 \n", + "telemetry_diff.disk.io_sum.write_bytes -0.576577 \n", + "telemetry_diff.disk.io_sum.read_time -0.588540 \n", + "telemetry_diff.disk.io_sum.write_time -0.570804 \n", + "telemetry_diff.network.netio_sum.bytes_sent -0.528206 \n", + "telemetry_diff.network.netio_sum.bytes_recv -0.565808 \n", + "telemetry_diff.network.netio_sum.packets_sent -0.554730 \n", + "telemetry_diff.network.netio_sum.packets_recv -0.563210 \n", + "telemetry_diff.network.netio_per_interface.lo0.... -0.578592 \n", + "telemetry_diff.network.netio_per_interface.lo0.... -0.566697 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.477162 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.525894 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.551055 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.546526 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.557710 \n", + "telemetry_diff.network.netio_per_interface.utun... -0.557186 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.365087 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.533059 \n", + "telemetry_diff.network.netio_per_interface.brid... -0.546957 \n", + "telemetry_diff.network.netio_per_interface.brid... -0.533059 \n", + "\n", + " generated.responsible_ai_metadata.shap_sum \\\n", + "used.max_epochs NaN \n", + "generated.loss NaN \n", + "generated.accuracy NaN \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops NaN \n", + "generated.responsible_ai_metadata.params NaN \n", + "generated.responsible_ai_metadata.max_width NaN \n", + "generated.responsible_ai_metadata.depth NaN \n", + "generated.responsible_ai_metadata.n_fc_layers NaN \n", + "generated.responsible_ai_metadata.n_cv_layers NaN \n", + "telemetry_diff.cpu.times_avg.user NaN \n", + "telemetry_diff.cpu.times_avg.system NaN \n", + "telemetry_diff.cpu.times_avg.idle NaN \n", + "telemetry_diff.process.memory.rss NaN \n", + "telemetry_diff.process.memory.vms NaN \n", + "telemetry_diff.process.memory.pfaults NaN \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user NaN \n", + "telemetry_diff.process.cpu_times.system NaN \n", + "telemetry_diff.process.num_open_file_descriptors NaN \n", + "telemetry_diff.process.num_connections NaN \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads NaN \n", + "telemetry_diff.process.num_ctx_switches.voluntary NaN \n", + "telemetry_diff.memory.virtual.available NaN \n", + "telemetry_diff.memory.virtual.used NaN \n", + "telemetry_diff.memory.virtual.free NaN \n", + "telemetry_diff.memory.virtual.active NaN \n", + "telemetry_diff.memory.virtual.inactive NaN \n", + "telemetry_diff.memory.virtual.wired NaN \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used NaN \n", + "telemetry_diff.memory.swap.free NaN \n", + "telemetry_diff.memory.swap.sin NaN \n", + "telemetry_diff.memory.swap.sout NaN \n", + "telemetry_diff.disk.disk_usage.free NaN \n", + "telemetry_diff.disk.io_sum.read_count NaN \n", + "telemetry_diff.disk.io_sum.write_count NaN \n", + "telemetry_diff.disk.io_sum.read_bytes NaN \n", + "telemetry_diff.disk.io_sum.write_bytes NaN \n", + "telemetry_diff.disk.io_sum.read_time NaN \n", + "telemetry_diff.disk.io_sum.write_time NaN \n", + "telemetry_diff.network.netio_sum.bytes_sent NaN \n", + "telemetry_diff.network.netio_sum.bytes_recv NaN \n", + "telemetry_diff.network.netio_sum.packets_sent NaN \n", + "telemetry_diff.network.netio_sum.packets_recv NaN \n", + "telemetry_diff.network.netio_per_interface.lo0.... NaN \n", + "telemetry_diff.network.netio_per_interface.lo0.... NaN \n", + "telemetry_diff.network.netio_per_interface.en0.... NaN \n", + "telemetry_diff.network.netio_per_interface.en0.... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.utun... NaN \n", + "telemetry_diff.network.netio_per_interface.vmen... NaN \n", + "telemetry_diff.network.netio_per_interface.vmen... NaN \n", + "telemetry_diff.network.netio_per_interface.brid... NaN \n", + "telemetry_diff.network.netio_per_interface.brid... NaN \n", + "\n", + " generated.responsible_ai_metadata.flops \\\n", + "used.max_epochs NaN \n", + "generated.loss 0.819808 \n", + "generated.accuracy -0.345728 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 1.000000 \n", + "generated.responsible_ai_metadata.params 0.999893 \n", + "generated.responsible_ai_metadata.max_width 0.994233 \n", + "generated.responsible_ai_metadata.depth 0.936884 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.934057 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.284137 \n", + "telemetry_diff.cpu.times_avg.user 0.256244 \n", + "telemetry_diff.cpu.times_avg.system 0.300953 \n", + "telemetry_diff.cpu.times_avg.idle 0.066049 \n", + "telemetry_diff.process.memory.rss -0.569155 \n", + "telemetry_diff.process.memory.vms -0.893210 \n", + "telemetry_diff.process.memory.pfaults 0.325536 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.257991 \n", + "telemetry_diff.process.cpu_times.system 0.316230 \n", + "telemetry_diff.process.num_open_file_descriptors 0.360464 \n", + "telemetry_diff.process.num_connections 0.360464 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.284137 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.311186 \n", + "telemetry_diff.memory.virtual.available 0.966133 \n", + "telemetry_diff.memory.virtual.used -0.969549 \n", + "telemetry_diff.memory.virtual.free 0.989489 \n", + "telemetry_diff.memory.virtual.active -0.849813 \n", + "telemetry_diff.memory.virtual.inactive -0.163899 \n", + "telemetry_diff.memory.virtual.wired -0.699543 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.381632 \n", + "telemetry_diff.memory.swap.free 0.381632 \n", + "telemetry_diff.memory.swap.sin 0.524952 \n", + "telemetry_diff.memory.swap.sout 0.268931 \n", + "telemetry_diff.disk.disk_usage.free 0.662385 \n", + "telemetry_diff.disk.io_sum.read_count 0.501497 \n", + "telemetry_diff.disk.io_sum.write_count 0.219564 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.513614 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.234541 \n", + "telemetry_diff.disk.io_sum.read_time 0.429828 \n", + "telemetry_diff.disk.io_sum.write_time 0.265604 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.122381 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.241929 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.220715 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.249781 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.265185 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.258166 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.017697 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.126500 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.237711 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.207800 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.247957 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.235496 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.284137 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.168233 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.224759 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.168233 \n", + "\n", + " generated.responsible_ai_metadata.params \\\n", + "used.max_epochs NaN \n", + "generated.loss 0.823472 \n", + "generated.accuracy -0.338603 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.999893 \n", + "generated.responsible_ai_metadata.params 1.000000 \n", + "generated.responsible_ai_metadata.max_width 0.995420 \n", + "generated.responsible_ai_metadata.depth 0.934735 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.937091 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.298127 \n", + "telemetry_diff.cpu.times_avg.user 0.242082 \n", + "telemetry_diff.cpu.times_avg.system 0.286976 \n", + "telemetry_diff.cpu.times_avg.idle 0.051451 \n", + "telemetry_diff.process.memory.rss -0.557103 \n", + "telemetry_diff.process.memory.vms -0.886669 \n", + "telemetry_diff.process.memory.pfaults 0.311675 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.243835 \n", + "telemetry_diff.process.cpu_times.system 0.302324 \n", + "telemetry_diff.process.num_open_file_descriptors 0.353758 \n", + "telemetry_diff.process.num_connections 0.353758 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.298127 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.297255 \n", + "telemetry_diff.memory.virtual.available 0.963450 \n", + "telemetry_diff.memory.virtual.used -0.973005 \n", + "telemetry_diff.memory.virtual.free 0.990349 \n", + "telemetry_diff.memory.virtual.active -0.857370 \n", + "telemetry_diff.memory.virtual.inactive -0.177951 \n", + "telemetry_diff.memory.virtual.wired -0.689120 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.368075 \n", + "telemetry_diff.memory.swap.free 0.368075 \n", + "telemetry_diff.memory.swap.sin 0.512450 \n", + "telemetry_diff.memory.swap.sout 0.254818 \n", + "telemetry_diff.disk.disk_usage.free 0.673251 \n", + "telemetry_diff.disk.io_sum.read_count 0.488792 \n", + "telemetry_diff.disk.io_sum.write_count 0.205283 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.501012 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.220307 \n", + "telemetry_diff.disk.io_sum.read_time 0.416579 \n", + "telemetry_diff.disk.io_sum.write_time 0.251479 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.107855 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.227716 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.206429 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.235595 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.251062 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.244012 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.032316 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.111981 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.223482 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.193474 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.233764 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.221259 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.298127 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.153800 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.210486 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.153800 \n", + "\n", + " generated.responsible_ai_metadata.max_width \\\n", + "used.max_epochs NaN \n", + "generated.loss 0.868819 \n", + "generated.accuracy -0.349589 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.994233 \n", + "generated.responsible_ai_metadata.params 0.995420 \n", + "generated.responsible_ai_metadata.max_width 1.000000 \n", + "generated.responsible_ai_metadata.depth 0.938519 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.964951 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.367405 \n", + "telemetry_diff.cpu.times_avg.user 0.169531 \n", + "telemetry_diff.cpu.times_avg.system 0.215123 \n", + "telemetry_diff.cpu.times_avg.idle -0.022527 \n", + "telemetry_diff.process.memory.rss -0.496968 \n", + "telemetry_diff.process.memory.vms -0.843689 \n", + "telemetry_diff.process.memory.pfaults 0.240280 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.171323 \n", + "telemetry_diff.process.cpu_times.system 0.230807 \n", + "telemetry_diff.process.num_open_file_descriptors 0.367405 \n", + "telemetry_diff.process.num_connections 0.367405 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.367405 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.225644 \n", + "telemetry_diff.memory.virtual.available 0.933537 \n", + "telemetry_diff.memory.virtual.used -0.983837 \n", + "telemetry_diff.memory.virtual.free 0.981822 \n", + "telemetry_diff.memory.virtual.active -0.887187 \n", + "telemetry_diff.memory.virtual.inactive -0.261248 \n", + "telemetry_diff.memory.virtual.wired -0.638971 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.297423 \n", + "telemetry_diff.memory.swap.free 0.297423 \n", + "telemetry_diff.memory.swap.sin 0.446546 \n", + "telemetry_diff.memory.swap.sout 0.181955 \n", + "telemetry_diff.disk.disk_usage.free 0.722127 \n", + "telemetry_diff.disk.io_sum.read_count 0.422115 \n", + "telemetry_diff.disk.io_sum.write_count 0.134015 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.434715 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.149105 \n", + "telemetry_diff.disk.io_sum.read_time 0.347665 \n", + "telemetry_diff.disk.io_sum.write_time 0.179699 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.034262 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.155625 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.133609 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.163271 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.179893 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.171930 \n", + "telemetry_diff.network.netio_per_interface.en0.... -0.106128 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.038137 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.150285 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.120129 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.161027 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.148537 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.367405 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.079860 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.137051 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.079860 \n", + "\n", + " generated.responsible_ai_metadata.depth \\\n", + "used.max_epochs NaN \n", + "generated.loss 0.896128 \n", + "generated.accuracy -0.649192 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.936884 \n", + "generated.responsible_ai_metadata.params 0.934735 \n", + "generated.responsible_ai_metadata.max_width 0.938519 \n", + "generated.responsible_ai_metadata.depth 1.000000 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.936586 \n", + "generated.responsible_ai_metadata.n_cv_layers -0.132453 \n", + "telemetry_diff.cpu.times_avg.user 0.376831 \n", + "telemetry_diff.cpu.times_avg.system 0.416864 \n", + "telemetry_diff.cpu.times_avg.idle 0.201962 \n", + "telemetry_diff.process.memory.rss -0.667256 \n", + "telemetry_diff.process.memory.vms -0.870138 \n", + "telemetry_diff.process.memory.pfaults 0.438754 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.378475 \n", + "telemetry_diff.process.cpu_times.system 0.430783 \n", + "telemetry_diff.process.num_open_file_descriptors 0.662266 \n", + "telemetry_diff.process.num_connections 0.662266 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 0.132453 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.426286 \n", + "telemetry_diff.memory.virtual.available 0.869560 \n", + "telemetry_diff.memory.virtual.used -0.865558 \n", + "telemetry_diff.memory.virtual.free 0.876572 \n", + "telemetry_diff.memory.virtual.active -0.701887 \n", + "telemetry_diff.memory.virtual.inactive -0.088462 \n", + "telemetry_diff.memory.virtual.wired -0.786457 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.485662 \n", + "telemetry_diff.memory.swap.free 0.485662 \n", + "telemetry_diff.memory.swap.sin 0.610518 \n", + "telemetry_diff.memory.swap.sout 0.385620 \n", + "telemetry_diff.disk.disk_usage.free 0.502120 \n", + "telemetry_diff.disk.io_sum.read_count 0.591194 \n", + "telemetry_diff.disk.io_sum.write_count 0.352632 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.601133 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.365632 \n", + "telemetry_diff.disk.io_sum.read_time 0.530098 \n", + "telemetry_diff.disk.io_sum.write_time 0.388557 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.255617 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.367318 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.345677 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.372658 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.391332 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.380867 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.122945 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.258013 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.358005 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.331935 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.368981 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.358651 \n", + "telemetry_diff.network.netio_per_interface.vmen... -0.132453 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.294547 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.345857 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.294547 \n", + "\n", + " generated.responsible_ai_metadata.n_fc_layers \\\n", + "used.max_epochs NaN \n", + "generated.loss 9.669773e-01 \n", + "generated.accuracy -4.485456e-01 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 9.340567e-01 \n", + "generated.responsible_ai_metadata.params 9.370909e-01 \n", + "generated.responsible_ai_metadata.max_width 9.649505e-01 \n", + "generated.responsible_ai_metadata.depth 9.365858e-01 \n", + "generated.responsible_ai_metadata.n_fc_layers 1.000000e+00 \n", + "generated.responsible_ai_metadata.n_cv_layers -4.714045e-01 \n", + "telemetry_diff.cpu.times_avg.user 3.337242e-02 \n", + "telemetry_diff.cpu.times_avg.system 7.788061e-02 \n", + "telemetry_diff.cpu.times_avg.idle -1.519078e-01 \n", + "telemetry_diff.process.memory.rss -3.729260e-01 \n", + "telemetry_diff.process.memory.vms -7.144685e-01 \n", + "telemetry_diff.process.memory.pfaults 1.025762e-01 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 3.516914e-02 \n", + "telemetry_diff.process.cpu_times.system 9.348204e-02 \n", + "telemetry_diff.process.num_open_file_descriptors 4.714045e-01 \n", + "telemetry_diff.process.num_connections 4.714045e-01 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads 4.714045e-01 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 8.840923e-02 \n", + "telemetry_diff.memory.virtual.available 8.108192e-01 \n", + "telemetry_diff.memory.virtual.used -9.500208e-01 \n", + "telemetry_diff.memory.virtual.free 9.016455e-01 \n", + "telemetry_diff.memory.virtual.active -8.871182e-01 \n", + "telemetry_diff.memory.virtual.inactive -4.214716e-01 \n", + "telemetry_diff.memory.virtual.wired -5.302289e-01 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -1.571348e-01 \n", + "telemetry_diff.memory.swap.free 1.571348e-01 \n", + "telemetry_diff.memory.swap.sin 3.074307e-01 \n", + "telemetry_diff.memory.swap.sout 4.363225e-02 \n", + "telemetry_diff.disk.disk_usage.free 7.668184e-01 \n", + "telemetry_diff.disk.io_sum.read_count 2.831263e-01 \n", + "telemetry_diff.disk.io_sum.write_count 5.305484e-03 \n", + "telemetry_diff.disk.io_sum.read_bytes 2.956057e-01 \n", + "telemetry_diff.disk.io_sum.write_bytes 1.954089e-02 \n", + "telemetry_diff.disk.io_sum.read_time 2.087714e-01 \n", + "telemetry_diff.disk.io_sum.write_time 4.564447e-02 \n", + "telemetry_diff.network.netio_sum.bytes_sent -9.669159e-02 \n", + "telemetry_diff.network.netio_sum.bytes_recv 2.226364e-02 \n", + "telemetry_diff.network.netio_sum.packets_sent -8.667188e-04 \n", + "telemetry_diff.network.netio_sum.packets_recv 2.845319e-02 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 4.810721e-02 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 3.735422e-02 \n", + "telemetry_diff.network.netio_per_interface.en0.... -2.313148e-01 \n", + "telemetry_diff.network.netio_per_interface.en0.... -9.397918e-02 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.315250e-02 \n", + "telemetry_diff.network.netio_per_interface.utun... -1.536456e-02 \n", + "telemetry_diff.network.netio_per_interface.utun... 2.482132e-02 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.333218e-02 \n", + "telemetry_diff.network.netio_per_interface.vmen... -4.714045e-01 \n", + "telemetry_diff.network.netio_per_interface.vmen... -5.517373e-02 \n", + "telemetry_diff.network.netio_per_interface.brid... 1.639908e-16 \n", + "telemetry_diff.network.netio_per_interface.brid... -5.517373e-02 \n", + "\n", + " generated.responsible_ai_metadata.n_cv_layers \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.479819 \n", + "generated.accuracy -0.365087 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops -0.284137 \n", + "generated.responsible_ai_metadata.params -0.298127 \n", + "generated.responsible_ai_metadata.max_width -0.367405 \n", + "generated.responsible_ai_metadata.depth -0.132453 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.471405 \n", + "generated.responsible_ai_metadata.n_cv_layers 1.000000 \n", + "telemetry_diff.cpu.times_avg.user 0.853946 \n", + "telemetry_diff.cpu.times_avg.system 0.828804 \n", + "telemetry_diff.cpu.times_avg.idle 0.937919 \n", + "telemetry_diff.process.memory.rss -0.624431 \n", + "telemetry_diff.process.memory.vms -0.168978 \n", + "telemetry_diff.process.memory.pfaults 0.814044 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.853002 \n", + "telemetry_diff.process.cpu_times.system 0.819705 \n", + "telemetry_diff.process.num_open_file_descriptors 0.333333 \n", + "telemetry_diff.process.num_connections 0.333333 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -1.000000 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.822737 \n", + "telemetry_diff.memory.virtual.available -0.104999 \n", + "telemetry_diff.memory.virtual.used 0.508791 \n", + "telemetry_diff.memory.virtual.free -0.344248 \n", + "telemetry_diff.memory.virtual.active 0.742773 \n", + "telemetry_diff.memory.virtual.inactive 0.969478 \n", + "telemetry_diff.memory.virtual.wired -0.479494 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.777778 \n", + "telemetry_diff.memory.swap.free 0.777778 \n", + "telemetry_diff.memory.swap.sin 0.666893 \n", + "telemetry_diff.memory.swap.sout 0.847046 \n", + "telemetry_diff.disk.disk_usage.free -0.905250 \n", + "telemetry_diff.disk.io_sum.read_count 0.687004 \n", + "telemetry_diff.disk.io_sum.write_count 0.872431 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.676720 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.864883 \n", + "telemetry_diff.disk.io_sum.read_time 0.743555 \n", + "telemetry_diff.disk.io_sum.write_time 0.848745 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.916774 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.861425 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.872387 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.857359 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.848764 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.852840 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.963662 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.915132 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.863758 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.878808 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.858377 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.864876 \n", + "telemetry_diff.network.netio_per_interface.vmen... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.897315 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.870388 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.897315 \n", + "\n", + " ... \\\n", + "used.max_epochs ... \n", + "generated.loss ... \n", + "generated.accuracy ... \n", + "generated.responsible_ai_metadata.shap_sum ... \n", + "generated.responsible_ai_metadata.flops ... \n", + "generated.responsible_ai_metadata.params ... \n", + "generated.responsible_ai_metadata.max_width ... \n", + "generated.responsible_ai_metadata.depth ... \n", + "generated.responsible_ai_metadata.n_fc_layers ... \n", + "generated.responsible_ai_metadata.n_cv_layers ... \n", + "telemetry_diff.cpu.times_avg.user ... \n", + "telemetry_diff.cpu.times_avg.system ... \n", + "telemetry_diff.cpu.times_avg.idle ... \n", + "telemetry_diff.process.memory.rss ... \n", + "telemetry_diff.process.memory.vms ... \n", + "telemetry_diff.process.memory.pfaults ... \n", + "telemetry_diff.process.memory.pageins ... \n", + "telemetry_diff.process.cpu_times.user ... \n", + "telemetry_diff.process.cpu_times.system ... \n", + "telemetry_diff.process.num_open_file_descriptors ... \n", + "telemetry_diff.process.num_connections ... \n", + "telemetry_diff.process.num_open_files ... \n", + "telemetry_diff.process.num_threads ... \n", + "telemetry_diff.process.num_ctx_switches.voluntary ... \n", + "telemetry_diff.memory.virtual.available ... \n", + "telemetry_diff.memory.virtual.used ... \n", + "telemetry_diff.memory.virtual.free ... \n", + "telemetry_diff.memory.virtual.active ... \n", + "telemetry_diff.memory.virtual.inactive ... \n", + "telemetry_diff.memory.virtual.wired ... \n", + "telemetry_diff.memory.swap.total ... \n", + "telemetry_diff.memory.swap.used ... \n", + "telemetry_diff.memory.swap.free ... \n", + "telemetry_diff.memory.swap.sin ... \n", + "telemetry_diff.memory.swap.sout ... \n", + "telemetry_diff.disk.disk_usage.free ... \n", + "telemetry_diff.disk.io_sum.read_count ... \n", + "telemetry_diff.disk.io_sum.write_count ... \n", + "telemetry_diff.disk.io_sum.read_bytes ... \n", + "telemetry_diff.disk.io_sum.write_bytes ... \n", + "telemetry_diff.disk.io_sum.read_time ... \n", + "telemetry_diff.disk.io_sum.write_time ... \n", + "telemetry_diff.network.netio_sum.bytes_sent ... \n", + "telemetry_diff.network.netio_sum.bytes_recv ... \n", + "telemetry_diff.network.netio_sum.packets_sent ... \n", + "telemetry_diff.network.netio_sum.packets_recv ... \n", + "telemetry_diff.network.netio_per_interface.lo0.... ... \n", + "telemetry_diff.network.netio_per_interface.lo0.... ... \n", + "telemetry_diff.network.netio_per_interface.en0.... ... \n", + "telemetry_diff.network.netio_per_interface.en0.... ... \n", + "telemetry_diff.network.netio_per_interface.utun... ... \n", + "telemetry_diff.network.netio_per_interface.utun... ... \n", + "telemetry_diff.network.netio_per_interface.utun... ... \n", + "telemetry_diff.network.netio_per_interface.utun... ... \n", + "telemetry_diff.network.netio_per_interface.vmen... ... \n", + "telemetry_diff.network.netio_per_interface.vmen... ... \n", + "telemetry_diff.network.netio_per_interface.brid... ... \n", + "telemetry_diff.network.netio_per_interface.brid... ... \n", + "\n", + " telemetry_diff.network.netio_per_interface.en0.bytes_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.271887 \n", + "generated.accuracy -0.477162 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops -0.017697 \n", + "generated.responsible_ai_metadata.params -0.032316 \n", + "generated.responsible_ai_metadata.max_width -0.106128 \n", + "generated.responsible_ai_metadata.depth 0.122945 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.231315 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.963662 \n", + "telemetry_diff.cpu.times_avg.user 0.961908 \n", + "telemetry_diff.cpu.times_avg.system 0.948146 \n", + "telemetry_diff.cpu.times_avg.idle 0.996488 \n", + "telemetry_diff.process.memory.rss -0.809753 \n", + "telemetry_diff.process.memory.vms -0.425057 \n", + "telemetry_diff.process.memory.pfaults 0.939603 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.961411 \n", + "telemetry_diff.process.cpu_times.system 0.942914 \n", + "telemetry_diff.process.num_open_file_descriptors 0.448156 \n", + "telemetry_diff.process.num_connections 0.448156 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.963662 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.944670 \n", + "telemetry_diff.memory.virtual.available 0.159649 \n", + "telemetry_diff.memory.virtual.used 0.260460 \n", + "telemetry_diff.memory.virtual.free -0.083329 \n", + "telemetry_diff.memory.virtual.active 0.537827 \n", + "telemetry_diff.memory.virtual.inactive 0.965301 \n", + "telemetry_diff.memory.virtual.wired -0.694941 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.917412 \n", + "telemetry_diff.memory.swap.free 0.917412 \n", + "telemetry_diff.memory.swap.sin 0.841708 \n", + "telemetry_diff.memory.swap.sout 0.958246 \n", + "telemetry_diff.disk.disk_usage.free -0.759478 \n", + "telemetry_diff.disk.io_sum.read_count 0.856146 \n", + "telemetry_diff.disk.io_sum.write_count 0.970971 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.848797 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.967271 \n", + "telemetry_diff.disk.io_sum.read_time 0.895152 \n", + "telemetry_diff.disk.io_sum.write_time 0.959094 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.990132 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.965721 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.971241 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.963668 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.958999 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.961292 \n", + "telemetry_diff.network.netio_per_interface.en0.... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.989567 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.966976 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.974338 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.964220 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.967527 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.963662 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.982614 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.970282 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.982614 \n", + "\n", + " telemetry_diff.network.netio_per_interface.en0.packets_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.149934 \n", + "generated.accuracy -0.525894 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.126500 \n", + "generated.responsible_ai_metadata.params 0.111981 \n", + "generated.responsible_ai_metadata.max_width 0.038137 \n", + "generated.responsible_ai_metadata.depth 0.258013 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.093979 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.915132 \n", + "telemetry_diff.cpu.times_avg.user 0.991258 \n", + "telemetry_diff.cpu.times_avg.system 0.984045 \n", + "telemetry_diff.cpu.times_avg.idle 0.998155 \n", + "telemetry_diff.process.memory.rss -0.885564 \n", + "telemetry_diff.process.memory.vms -0.550086 \n", + "telemetry_diff.process.memory.pfaults 0.979111 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.991018 \n", + "telemetry_diff.process.cpu_times.system 0.981058 \n", + "telemetry_diff.process.num_open_file_descriptors 0.499274 \n", + "telemetry_diff.process.num_connections 0.499274 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.915132 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.982073 \n", + "telemetry_diff.memory.virtual.available 0.296941 \n", + "telemetry_diff.memory.virtual.used 0.118828 \n", + "telemetry_diff.memory.virtual.free 0.059440 \n", + "telemetry_diff.memory.virtual.active 0.411387 \n", + "telemetry_diff.memory.virtual.inactive 0.933358 \n", + "telemetry_diff.memory.virtual.wired -0.790574 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.965147 \n", + "telemetry_diff.memory.swap.free 0.965147 \n", + "telemetry_diff.memory.swap.sin 0.910695 \n", + "telemetry_diff.memory.swap.sout 0.989426 \n", + "telemetry_diff.disk.disk_usage.free -0.658216 \n", + "telemetry_diff.disk.io_sum.read_count 0.921648 \n", + "telemetry_diff.disk.io_sum.write_count 0.995059 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.916098 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.993540 \n", + "telemetry_diff.disk.io_sum.read_time 0.950029 \n", + "telemetry_diff.disk.io_sum.write_time 0.989850 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.999982 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.993014 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.995409 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.992090 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.989728 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.990948 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.989567 \n", + "telemetry_diff.network.netio_per_interface.en0.... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.993595 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.996600 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.992354 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.993849 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.915132 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.999096 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.995003 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999096 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.bytes_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.055562 \n", + "generated.accuracy -0.551055 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.237711 \n", + "generated.responsible_ai_metadata.params 0.223482 \n", + "generated.responsible_ai_metadata.max_width 0.150285 \n", + "generated.responsible_ai_metadata.depth 0.358005 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.013152 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.863758 \n", + "telemetry_diff.cpu.times_avg.user 0.999795 \n", + "telemetry_diff.cpu.times_avg.system 0.997822 \n", + "telemetry_diff.cpu.times_avg.idle 0.984910 \n", + "telemetry_diff.process.memory.rss -0.931697 \n", + "telemetry_diff.process.memory.vms -0.640690 \n", + "telemetry_diff.process.memory.pfaults 0.995789 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.999757 \n", + "telemetry_diff.process.cpu_times.system 0.996633 \n", + "telemetry_diff.process.num_open_file_descriptors 0.526625 \n", + "telemetry_diff.process.num_connections 0.526625 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.863758 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.997053 \n", + "telemetry_diff.memory.virtual.available 0.401516 \n", + "telemetry_diff.memory.virtual.used 0.005869 \n", + "telemetry_diff.memory.virtual.free 0.171372 \n", + "telemetry_diff.memory.virtual.active 0.305819 \n", + "telemetry_diff.memory.virtual.inactive 0.896168 \n", + "telemetry_diff.memory.virtual.wired -0.853364 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.988536 \n", + "telemetry_diff.memory.swap.free 0.988536 \n", + "telemetry_diff.memory.swap.sin 0.951522 \n", + "telemetry_diff.memory.swap.sout 0.999478 \n", + "telemetry_diff.disk.disk_usage.free -0.568944 \n", + "telemetry_diff.disk.io_sum.read_count 0.959568 \n", + "telemetry_diff.disk.io_sum.write_count 0.999227 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.955518 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.999452 \n", + "telemetry_diff.disk.io_sum.read_time 0.979191 \n", + "telemetry_diff.disk.io_sum.write_time 0.999439 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.993091 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.999842 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.999803 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.999853 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999232 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999681 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.966976 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.993595 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999524 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999930 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999963 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.863758 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.997482 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999910 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.997482 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.bytes_recv \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.080247 \n", + "generated.accuracy -0.546526 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.207800 \n", + "generated.responsible_ai_metadata.params 0.193474 \n", + "generated.responsible_ai_metadata.max_width 0.120129 \n", + "generated.responsible_ai_metadata.depth 0.331935 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.015365 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.878808 \n", + "telemetry_diff.cpu.times_avg.user 0.998753 \n", + "telemetry_diff.cpu.times_avg.system 0.995354 \n", + "telemetry_diff.cpu.times_avg.idle 0.989760 \n", + "telemetry_diff.process.memory.rss -0.920466 \n", + "telemetry_diff.process.memory.vms -0.616711 \n", + "telemetry_diff.process.memory.pfaults 0.992530 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.998661 \n", + "telemetry_diff.process.cpu_times.system 0.993677 \n", + "telemetry_diff.process.num_open_file_descriptors 0.521490 \n", + "telemetry_diff.process.num_connections 0.521490 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.878808 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.994259 \n", + "telemetry_diff.memory.virtual.available 0.373239 \n", + "telemetry_diff.memory.virtual.used 0.036619 \n", + "telemetry_diff.memory.virtual.free 0.140923 \n", + "telemetry_diff.memory.virtual.active 0.335019 \n", + "telemetry_diff.memory.virtual.inactive 0.906974 \n", + "telemetry_diff.memory.virtual.wired -0.837588 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.983428 \n", + "telemetry_diff.memory.swap.free 0.983428 \n", + "telemetry_diff.memory.swap.sin 0.941635 \n", + "telemetry_diff.memory.swap.sout 0.998008 \n", + "telemetry_diff.disk.disk_usage.free -0.594005 \n", + "telemetry_diff.disk.io_sum.read_count 0.950485 \n", + "telemetry_diff.disk.io_sum.write_count 0.999428 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.946020 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.999176 \n", + "telemetry_diff.disk.io_sum.read_time 0.972517 \n", + "telemetry_diff.disk.io_sum.write_time 0.998132 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.996235 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.999286 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.999892 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.999032 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.997967 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.998600 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.974338 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.996600 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999524 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999147 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999583 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.878808 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.999179 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999839 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999179 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.packets_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.043729 \n", + "generated.accuracy -0.557710 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.247957 \n", + "generated.responsible_ai_metadata.params 0.233764 \n", + "generated.responsible_ai_metadata.max_width 0.161027 \n", + "generated.responsible_ai_metadata.depth 0.368981 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.024821 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.858377 \n", + "telemetry_diff.cpu.times_avg.user 0.999963 \n", + "telemetry_diff.cpu.times_avg.system 0.998481 \n", + "telemetry_diff.cpu.times_avg.idle 0.983031 \n", + "telemetry_diff.process.memory.rss -0.935748 \n", + "telemetry_diff.process.memory.vms -0.648229 \n", + "telemetry_diff.process.memory.pfaults 0.996720 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.999945 \n", + "telemetry_diff.process.cpu_times.system 0.997465 \n", + "telemetry_diff.process.num_open_file_descriptors 0.533560 \n", + "telemetry_diff.process.num_connections 0.533560 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.858377 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.997829 \n", + "telemetry_diff.memory.virtual.available 0.409941 \n", + "telemetry_diff.memory.virtual.used -0.004541 \n", + "telemetry_diff.memory.virtual.free 0.180982 \n", + "telemetry_diff.memory.virtual.active 0.296126 \n", + "telemetry_diff.memory.virtual.inactive 0.890840 \n", + "telemetry_diff.memory.virtual.wired -0.859256 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.990051 \n", + "telemetry_diff.memory.swap.free 0.990051 \n", + "telemetry_diff.memory.swap.sin 0.954707 \n", + "telemetry_diff.memory.swap.sout 0.999740 \n", + "telemetry_diff.disk.disk_usage.free -0.560470 \n", + "telemetry_diff.disk.io_sum.read_count 0.962488 \n", + "telemetry_diff.disk.io_sum.write_count 0.999149 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.958574 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.999527 \n", + "telemetry_diff.disk.io_sum.read_time 0.981293 \n", + "telemetry_diff.disk.io_sum.write_time 0.999766 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.991830 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.999911 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.999599 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.999978 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999608 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999909 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.964220 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.992354 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999930 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999147 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999914 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.858377 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.996656 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999692 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.996656 \n", + "\n", + " telemetry_diff.network.netio_per_interface.utun4.packets_recv \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.053281 \n", + "generated.accuracy -0.557186 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.235496 \n", + "generated.responsible_ai_metadata.params 0.221259 \n", + "generated.responsible_ai_metadata.max_width 0.148537 \n", + "generated.responsible_ai_metadata.depth 0.358651 \n", + "generated.responsible_ai_metadata.n_fc_layers 0.013332 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.864876 \n", + "telemetry_diff.cpu.times_avg.user 0.999770 \n", + "telemetry_diff.cpu.times_avg.system 0.997690 \n", + "telemetry_diff.cpu.times_avg.idle 0.985295 \n", + "telemetry_diff.process.memory.rss -0.931360 \n", + "telemetry_diff.process.memory.vms -0.638209 \n", + "telemetry_diff.process.memory.pfaults 0.995598 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.999730 \n", + "telemetry_diff.process.cpu_times.system 0.996472 \n", + "telemetry_diff.process.num_open_file_descriptors 0.532793 \n", + "telemetry_diff.process.num_connections 0.532793 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.864876 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.996904 \n", + "telemetry_diff.memory.virtual.available 0.397912 \n", + "telemetry_diff.memory.virtual.used 0.008370 \n", + "telemetry_diff.memory.virtual.free 0.168082 \n", + "telemetry_diff.memory.virtual.active 0.308519 \n", + "telemetry_diff.memory.virtual.inactive 0.895238 \n", + "telemetry_diff.memory.virtual.wired -0.853010 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.988140 \n", + "telemetry_diff.memory.swap.free 0.988140 \n", + "telemetry_diff.memory.swap.sin 0.950792 \n", + "telemetry_diff.memory.swap.sout 0.999355 \n", + "telemetry_diff.disk.disk_usage.free -0.571158 \n", + "telemetry_diff.disk.io_sum.read_count 0.958915 \n", + "telemetry_diff.disk.io_sum.write_count 0.999519 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.954824 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.999695 \n", + "telemetry_diff.disk.io_sum.read_time 0.978736 \n", + "telemetry_diff.disk.io_sum.write_time 0.999477 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.993390 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.999938 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.999884 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.999885 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999353 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.999710 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.967527 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.993849 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999963 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999583 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999914 \n", + "telemetry_diff.network.netio_per_interface.utun... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.864876 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.997597 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.999893 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.997597 \n", + "\n", + " telemetry_diff.network.netio_per_interface.vmenet0.bytes_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.479819 \n", + "generated.accuracy -0.365087 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops -0.284137 \n", + "generated.responsible_ai_metadata.params -0.298127 \n", + "generated.responsible_ai_metadata.max_width -0.367405 \n", + "generated.responsible_ai_metadata.depth -0.132453 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.471405 \n", + "generated.responsible_ai_metadata.n_cv_layers 1.000000 \n", + "telemetry_diff.cpu.times_avg.user 0.853946 \n", + "telemetry_diff.cpu.times_avg.system 0.828804 \n", + "telemetry_diff.cpu.times_avg.idle 0.937919 \n", + "telemetry_diff.process.memory.rss -0.624431 \n", + "telemetry_diff.process.memory.vms -0.168978 \n", + "telemetry_diff.process.memory.pfaults 0.814044 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.853002 \n", + "telemetry_diff.process.cpu_times.system 0.819705 \n", + "telemetry_diff.process.num_open_file_descriptors 0.333333 \n", + "telemetry_diff.process.num_connections 0.333333 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -1.000000 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.822737 \n", + "telemetry_diff.memory.virtual.available -0.104999 \n", + "telemetry_diff.memory.virtual.used 0.508791 \n", + "telemetry_diff.memory.virtual.free -0.344248 \n", + "telemetry_diff.memory.virtual.active 0.742773 \n", + "telemetry_diff.memory.virtual.inactive 0.969478 \n", + "telemetry_diff.memory.virtual.wired -0.479494 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.777778 \n", + "telemetry_diff.memory.swap.free 0.777778 \n", + "telemetry_diff.memory.swap.sin 0.666893 \n", + "telemetry_diff.memory.swap.sout 0.847046 \n", + "telemetry_diff.disk.disk_usage.free -0.905250 \n", + "telemetry_diff.disk.io_sum.read_count 0.687004 \n", + "telemetry_diff.disk.io_sum.write_count 0.872431 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.676720 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.864883 \n", + "telemetry_diff.disk.io_sum.read_time 0.743555 \n", + "telemetry_diff.disk.io_sum.write_time 0.848745 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.916774 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.861425 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.872387 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.857359 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.848764 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.852840 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.963662 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.915132 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.863758 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.878808 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.858377 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.864876 \n", + "telemetry_diff.network.netio_per_interface.vmen... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.897315 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.870388 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.897315 \n", + "\n", + " telemetry_diff.network.netio_per_interface.vmenet0.packets_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -0.116829 \n", + "generated.accuracy -0.533059 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.168233 \n", + "generated.responsible_ai_metadata.params 0.153800 \n", + "generated.responsible_ai_metadata.max_width 0.079860 \n", + "generated.responsible_ai_metadata.depth 0.294547 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.055174 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.897315 \n", + "telemetry_diff.cpu.times_avg.user 0.995913 \n", + "telemetry_diff.cpu.times_avg.system 0.990647 \n", + "telemetry_diff.cpu.times_avg.idle 0.994696 \n", + "telemetry_diff.process.memory.rss -0.903897 \n", + "telemetry_diff.process.memory.vms -0.585088 \n", + "telemetry_diff.process.memory.pfaults 0.986789 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.995747 \n", + "telemetry_diff.process.cpu_times.system 0.988324 \n", + "telemetry_diff.process.num_open_file_descriptors 0.507178 \n", + "telemetry_diff.process.num_connections 0.507178 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.897315 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.989118 \n", + "telemetry_diff.memory.virtual.available 0.337158 \n", + "telemetry_diff.memory.virtual.used 0.076707 \n", + "telemetry_diff.memory.virtual.free 0.101826 \n", + "telemetry_diff.memory.virtual.active 0.372320 \n", + "telemetry_diff.memory.virtual.inactive 0.921679 \n", + "telemetry_diff.memory.virtual.wired -0.814837 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.975343 \n", + "telemetry_diff.memory.swap.free 0.975343 \n", + "telemetry_diff.memory.swap.sin 0.927314 \n", + "telemetry_diff.memory.swap.sout 0.994675 \n", + "telemetry_diff.disk.disk_usage.free -0.625691 \n", + "telemetry_diff.disk.io_sum.read_count 0.937189 \n", + "telemetry_diff.disk.io_sum.write_count 0.997982 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.932196 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.997119 \n", + "telemetry_diff.disk.io_sum.read_time 0.962332 \n", + "telemetry_diff.disk.io_sum.write_time 0.994857 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.998880 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.996993 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.998511 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.996438 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.994665 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.995648 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.982614 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.999096 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.997482 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999179 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.996656 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.997597 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.897315 \n", + "telemetry_diff.network.netio_per_interface.vmen... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.998338 \n", + "telemetry_diff.network.netio_per_interface.brid... 1.000000 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_sent \\\n", + "used.max_epochs NaN \n", + "generated.loss -6.767772e-02 \n", + "generated.accuracy -5.469569e-01 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 2.247585e-01 \n", + "generated.responsible_ai_metadata.params 2.104857e-01 \n", + "generated.responsible_ai_metadata.max_width 1.370506e-01 \n", + "generated.responsible_ai_metadata.depth 3.458572e-01 \n", + "generated.responsible_ai_metadata.n_fc_layers 1.639908e-16 \n", + "generated.responsible_ai_metadata.n_cv_layers 8.703883e-01 \n", + "telemetry_diff.cpu.times_avg.user 9.994417e-01 \n", + "telemetry_diff.cpu.times_avg.system 9.968501e-01 \n", + "telemetry_diff.cpu.times_avg.idle 9.871205e-01 \n", + "telemetry_diff.process.memory.rss -9.267632e-01 \n", + "telemetry_diff.process.memory.vms -6.305982e-01 \n", + "telemetry_diff.process.memory.pfaults 9.944736e-01 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 9.993796e-01 \n", + "telemetry_diff.process.cpu_times.system 9.954462e-01 \n", + "telemetry_diff.process.num_open_file_descriptors 5.222330e-01 \n", + "telemetry_diff.process.num_connections 5.222330e-01 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -8.703883e-01 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 9.959365e-01 \n", + "telemetry_diff.memory.virtual.available 3.898045e-01 \n", + "telemetry_diff.memory.virtual.used 1.913862e-02 \n", + "telemetry_diff.memory.virtual.free 1.585301e-01 \n", + "telemetry_diff.memory.virtual.active 3.183437e-01 \n", + "telemetry_diff.memory.virtual.inactive 9.015499e-01 \n", + "telemetry_diff.memory.virtual.wired -8.463404e-01 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -9.864401e-01 \n", + "telemetry_diff.memory.swap.free 9.864401e-01 \n", + "telemetry_diff.memory.swap.sin 9.473410e-01 \n", + "telemetry_diff.memory.swap.sout 9.989610e-01 \n", + "telemetry_diff.disk.disk_usage.free -5.797646e-01 \n", + "telemetry_diff.disk.io_sum.read_count 9.557312e-01 \n", + "telemetry_diff.disk.io_sum.write_count 9.993365e-01 \n", + "telemetry_diff.disk.io_sum.read_bytes 9.515041e-01 \n", + "telemetry_diff.disk.io_sum.write_bytes 9.993589e-01 \n", + "telemetry_diff.disk.io_sum.read_time 9.763949e-01 \n", + "telemetry_diff.disk.io_sum.write_time 9.989421e-01 \n", + "telemetry_diff.network.netio_sum.bytes_sent 9.945481e-01 \n", + "telemetry_diff.network.netio_sum.bytes_recv 9.996702e-01 \n", + "telemetry_diff.network.netio_sum.packets_sent 9.999324e-01 \n", + "telemetry_diff.network.netio_sum.packets_recv 9.995813e-01 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 9.987263e-01 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 9.992907e-01 \n", + "telemetry_diff.network.netio_per_interface.en0.... 9.702818e-01 \n", + "telemetry_diff.network.netio_per_interface.en0.... 9.950035e-01 \n", + "telemetry_diff.network.netio_per_interface.utun... 9.999104e-01 \n", + "telemetry_diff.network.netio_per_interface.utun... 9.998390e-01 \n", + "telemetry_diff.network.netio_per_interface.utun... 9.996919e-01 \n", + "telemetry_diff.network.netio_per_interface.utun... 9.998925e-01 \n", + "telemetry_diff.network.netio_per_interface.vmen... 8.703883e-01 \n", + "telemetry_diff.network.netio_per_interface.vmen... 9.983382e-01 \n", + "telemetry_diff.network.netio_per_interface.brid... 1.000000e+00 \n", + "telemetry_diff.network.netio_per_interface.brid... 9.983382e-01 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_sent \n", + "used.max_epochs NaN \n", + "generated.loss -0.116829 \n", + "generated.accuracy -0.533059 \n", + "generated.responsible_ai_metadata.shap_sum NaN \n", + "generated.responsible_ai_metadata.flops 0.168233 \n", + "generated.responsible_ai_metadata.params 0.153800 \n", + "generated.responsible_ai_metadata.max_width 0.079860 \n", + "generated.responsible_ai_metadata.depth 0.294547 \n", + "generated.responsible_ai_metadata.n_fc_layers -0.055174 \n", + "generated.responsible_ai_metadata.n_cv_layers 0.897315 \n", + "telemetry_diff.cpu.times_avg.user 0.995913 \n", + "telemetry_diff.cpu.times_avg.system 0.990647 \n", + "telemetry_diff.cpu.times_avg.idle 0.994696 \n", + "telemetry_diff.process.memory.rss -0.903897 \n", + "telemetry_diff.process.memory.vms -0.585088 \n", + "telemetry_diff.process.memory.pfaults 0.986789 \n", + "telemetry_diff.process.memory.pageins NaN \n", + "telemetry_diff.process.cpu_times.user 0.995747 \n", + "telemetry_diff.process.cpu_times.system 0.988324 \n", + "telemetry_diff.process.num_open_file_descriptors 0.507178 \n", + "telemetry_diff.process.num_connections 0.507178 \n", + "telemetry_diff.process.num_open_files NaN \n", + "telemetry_diff.process.num_threads -0.897315 \n", + "telemetry_diff.process.num_ctx_switches.voluntary 0.989118 \n", + "telemetry_diff.memory.virtual.available 0.337158 \n", + "telemetry_diff.memory.virtual.used 0.076707 \n", + "telemetry_diff.memory.virtual.free 0.101826 \n", + "telemetry_diff.memory.virtual.active 0.372320 \n", + "telemetry_diff.memory.virtual.inactive 0.921679 \n", + "telemetry_diff.memory.virtual.wired -0.814837 \n", + "telemetry_diff.memory.swap.total NaN \n", + "telemetry_diff.memory.swap.used -0.975343 \n", + "telemetry_diff.memory.swap.free 0.975343 \n", + "telemetry_diff.memory.swap.sin 0.927314 \n", + "telemetry_diff.memory.swap.sout 0.994675 \n", + "telemetry_diff.disk.disk_usage.free -0.625691 \n", + "telemetry_diff.disk.io_sum.read_count 0.937189 \n", + "telemetry_diff.disk.io_sum.write_count 0.997982 \n", + "telemetry_diff.disk.io_sum.read_bytes 0.932196 \n", + "telemetry_diff.disk.io_sum.write_bytes 0.997119 \n", + "telemetry_diff.disk.io_sum.read_time 0.962332 \n", + "telemetry_diff.disk.io_sum.write_time 0.994857 \n", + "telemetry_diff.network.netio_sum.bytes_sent 0.998880 \n", + "telemetry_diff.network.netio_sum.bytes_recv 0.996993 \n", + "telemetry_diff.network.netio_sum.packets_sent 0.998511 \n", + "telemetry_diff.network.netio_sum.packets_recv 0.996438 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.994665 \n", + "telemetry_diff.network.netio_per_interface.lo0.... 0.995648 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.982614 \n", + "telemetry_diff.network.netio_per_interface.en0.... 0.999096 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.997482 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.999179 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.996656 \n", + "telemetry_diff.network.netio_per_interface.utun... 0.997597 \n", + "telemetry_diff.network.netio_per_interface.vmen... 0.897315 \n", + "telemetry_diff.network.netio_per_interface.vmen... 1.000000 \n", + "telemetry_diff.network.netio_per_interface.brid... 0.998338 \n", + "telemetry_diff.network.netio_per_interface.brid... 1.000000 \n", + "\n", + "[58 rows x 58 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df.corr()" ] @@ -265,12 +3897,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "e03dab0b-1a03-46a7-bbb2-4d16339abfe1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of columns originally: 334\n", + "Number of columns later: 39\n" + ] + } + ], "source": [ "df = query_api.df_query(_filter, calculate_telemetry_diff=True)\n", "df = analytics.clean_dataframe(df, aggregate_telemetry=True, sum_lists=True)" @@ -288,12 +3929,145 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "89923e60-b251-45aa-8723-d42c548f8ea1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
0generated.lossgenerated.accuracy0.18
1generated.lossgenerated.responsible_ai_metadata.flops0.43
2generated.lossgenerated.responsible_ai_metadata.params0.43
3generated.lossgenerated.responsible_ai_metadata.max_width0.83
4generated.lossgenerated.responsible_ai_metadata.depth0.49
............
625used.softmax_dims_sumtelemetry_diff.disk.activity0.04
626used.softmax_dims_sumtelemetry_diff.process.activity-0.10
627telemetry_diff.network.activitytelemetry_diff.disk.activity0.93
628telemetry_diff.network.activitytelemetry_diff.process.activity1.00
629telemetry_diff.disk.activitytelemetry_diff.process.activity0.93
\n", + "

630 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " col_1 \\\n", + "0 generated.loss \n", + "1 generated.loss \n", + "2 generated.loss \n", + "3 generated.loss \n", + "4 generated.loss \n", + ".. ... \n", + "625 used.softmax_dims_sum \n", + "626 used.softmax_dims_sum \n", + "627 telemetry_diff.network.activity \n", + "628 telemetry_diff.network.activity \n", + "629 telemetry_diff.disk.activity \n", + "\n", + " col_2 correlation \n", + "0 generated.accuracy 0.18 \n", + "1 generated.responsible_ai_metadata.flops 0.43 \n", + "2 generated.responsible_ai_metadata.params 0.43 \n", + "3 generated.responsible_ai_metadata.max_width 0.83 \n", + "4 generated.responsible_ai_metadata.depth 0.49 \n", + ".. ... ... \n", + "625 telemetry_diff.disk.activity 0.04 \n", + "626 telemetry_diff.process.activity -0.10 \n", + "627 telemetry_diff.disk.activity 0.93 \n", + "628 telemetry_diff.process.activity 1.00 \n", + "629 telemetry_diff.process.activity 0.93 \n", + "\n", + "[630 rows x 3 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations(df)" ] @@ -310,84 +4084,1208 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "fe702218-c80c-4e78-a642-8a91b5571b1d", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
0generated.lossgenerated.responsible_ai_metadata.max_width0.93
1generated.lossgenerated.responsible_ai_metadata.n_fc_layers0.94
2generated.lossused.softmax_dims_sum0.94
3generated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.params1.00
4generated.responsible_ai_metadata.flopsgenerated.responsible_ai_metadata.depth0.98
............
176used.conv_pool_sizes_sumtelemetry_diff.disk.activity0.94
177used.fc_in_outs_sumused.softmax_dims_sum0.95
178telemetry_diff.network.activitytelemetry_diff.disk.activity0.98
179telemetry_diff.network.activitytelemetry_diff.process.activity1.00
180telemetry_diff.disk.activitytelemetry_diff.process.activity0.98
\n", + "

181 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " col_1 \\\n", + "0 generated.loss \n", + "1 generated.loss \n", + "2 generated.loss \n", + "3 generated.responsible_ai_metadata.flops \n", + "4 generated.responsible_ai_metadata.flops \n", + ".. ... \n", + "176 used.conv_pool_sizes_sum \n", + "177 used.fc_in_outs_sum \n", + "178 telemetry_diff.network.activity \n", + "179 telemetry_diff.network.activity \n", + "180 telemetry_diff.disk.activity \n", + "\n", + " col_2 correlation \n", + "0 generated.responsible_ai_metadata.max_width 0.93 \n", + "1 generated.responsible_ai_metadata.n_fc_layers 0.94 \n", + "2 used.softmax_dims_sum 0.94 \n", + "3 generated.responsible_ai_metadata.params 1.00 \n", + "4 generated.responsible_ai_metadata.depth 0.98 \n", + ".. ... ... \n", + "176 telemetry_diff.disk.activity 0.94 \n", + "177 used.softmax_dims_sum 0.95 \n", + "178 telemetry_diff.disk.activity 0.98 \n", + "179 telemetry_diff.process.activity 1.00 \n", + "180 telemetry_diff.process.activity 0.98 \n", + "\n", + "[181 rows x 3 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations(df, method='spearman', threshold=0.9)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "f68a5db8-fcbe-4762-83fe-255a19a3ccc8", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
2generated.lossused.fc_in_outs_sum0.64
3generated.lossused.softmax_dims_sum0.87
8generated.accuracyused.conv_in_outs_sum-0.57
9generated.accuracyused.conv_kernel_sizes_sum-0.57
10generated.accuracyused.conv_pool_sizes_sum-0.57
25generated.responsible_ai_metadata.flopsused.fc_in_outs_sum0.79
26generated.responsible_ai_metadata.flopsused.softmax_dims_sum0.62
41generated.responsible_ai_metadata.paramsused.fc_in_outs_sum0.79
42generated.responsible_ai_metadata.paramsused.softmax_dims_sum0.62
47generated.responsible_ai_metadata.max_widthused.fc_in_outs_sum0.91
48generated.responsible_ai_metadata.max_widthused.softmax_dims_sum0.96
59generated.responsible_ai_metadata.depthused.fc_in_outs_sum0.87
60generated.responsible_ai_metadata.depthused.softmax_dims_sum0.70
63generated.responsible_ai_metadata.n_fc_layersused.fc_in_outs_sum0.87
64generated.responsible_ai_metadata.n_fc_layersused.softmax_dims_sum1.00
83generated.responsible_ai_metadata.n_cv_layersused.conv_in_outs_sum1.00
84generated.responsible_ai_metadata.n_cv_layersused.conv_kernel_sizes_sum1.00
85generated.responsible_ai_metadata.n_cv_layersused.conv_pool_sizes_sum1.00
\n", + "
" + ], + "text/plain": [ + " col_1 col_2 \\\n", + "2 generated.loss used.fc_in_outs_sum \n", + "3 generated.loss used.softmax_dims_sum \n", + "8 generated.accuracy used.conv_in_outs_sum \n", + "9 generated.accuracy used.conv_kernel_sizes_sum \n", + "10 generated.accuracy used.conv_pool_sizes_sum \n", + "25 generated.responsible_ai_metadata.flops used.fc_in_outs_sum \n", + "26 generated.responsible_ai_metadata.flops used.softmax_dims_sum \n", + "41 generated.responsible_ai_metadata.params used.fc_in_outs_sum \n", + "42 generated.responsible_ai_metadata.params used.softmax_dims_sum \n", + "47 generated.responsible_ai_metadata.max_width used.fc_in_outs_sum \n", + "48 generated.responsible_ai_metadata.max_width used.softmax_dims_sum \n", + "59 generated.responsible_ai_metadata.depth used.fc_in_outs_sum \n", + "60 generated.responsible_ai_metadata.depth used.softmax_dims_sum \n", + "63 generated.responsible_ai_metadata.n_fc_layers used.fc_in_outs_sum \n", + "64 generated.responsible_ai_metadata.n_fc_layers used.softmax_dims_sum \n", + "83 generated.responsible_ai_metadata.n_cv_layers used.conv_in_outs_sum \n", + "84 generated.responsible_ai_metadata.n_cv_layers used.conv_kernel_sizes_sum \n", + "85 generated.responsible_ai_metadata.n_cv_layers used.conv_pool_sizes_sum \n", + "\n", + " correlation \n", + "2 0.64 \n", + "3 0.87 \n", + "8 -0.57 \n", + "9 -0.57 \n", + "10 -0.57 \n", + "25 0.79 \n", + "26 0.62 \n", + "41 0.79 \n", + "42 0.62 \n", + "47 0.91 \n", + "48 0.96 \n", + "59 0.87 \n", + "60 0.70 \n", + "63 0.87 \n", + "64 1.00 \n", + "83 1.00 \n", + "84 1.00 \n", + "85 1.00 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations_between(df, col_pattern1=\"generated.\", col_pattern2=\"used.\", threshold=0.5)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "43601683-a091-412a-bbc6-e66f78546fc9", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
2generated.lossused.softmax_dims_sum0.87
7generated.responsible_ai_metadata.max_widthused.fc_in_outs_sum0.91
8generated.responsible_ai_metadata.max_widthused.softmax_dims_sum0.96
9generated.responsible_ai_metadata.depthused.fc_in_outs_sum0.87
10generated.responsible_ai_metadata.n_fc_layersused.fc_in_outs_sum0.87
11generated.responsible_ai_metadata.n_fc_layersused.softmax_dims_sum1.00
26generated.responsible_ai_metadata.n_cv_layersused.conv_in_outs_sum1.00
27generated.responsible_ai_metadata.n_cv_layersused.conv_kernel_sizes_sum1.00
28generated.responsible_ai_metadata.n_cv_layersused.conv_pool_sizes_sum1.00
\n", + "
" + ], + "text/plain": [ + " col_1 col_2 \\\n", + "2 generated.loss used.softmax_dims_sum \n", + "7 generated.responsible_ai_metadata.max_width used.fc_in_outs_sum \n", + "8 generated.responsible_ai_metadata.max_width used.softmax_dims_sum \n", + "9 generated.responsible_ai_metadata.depth used.fc_in_outs_sum \n", + "10 generated.responsible_ai_metadata.n_fc_layers used.fc_in_outs_sum \n", + "11 generated.responsible_ai_metadata.n_fc_layers used.softmax_dims_sum \n", + "26 generated.responsible_ai_metadata.n_cv_layers used.conv_in_outs_sum \n", + "27 generated.responsible_ai_metadata.n_cv_layers used.conv_kernel_sizes_sum \n", + "28 generated.responsible_ai_metadata.n_cv_layers used.conv_pool_sizes_sum \n", + "\n", + " correlation \n", + "2 0.87 \n", + "7 0.91 \n", + "8 0.96 \n", + "9 0.87 \n", + "10 0.87 \n", + "11 1.00 \n", + "26 1.00 \n", + "27 1.00 \n", + "28 1.00 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations_used_vs_generated(df, threshold=0.8)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "01ea1a46-7fe7-4334-b546-b23943af98e4", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
42telemetry_diff.cpu.times_avg.userused.conv_in_outs_sum0.87
43telemetry_diff.cpu.times_avg.userused.conv_kernel_sizes_sum0.87
44telemetry_diff.cpu.times_avg.userused.conv_pool_sizes_sum0.87
57telemetry_diff.cpu.times_avg.systemused.conv_in_outs_sum0.87
58telemetry_diff.cpu.times_avg.systemused.conv_kernel_sizes_sum0.87
59telemetry_diff.cpu.times_avg.systemused.conv_pool_sizes_sum0.87
71telemetry_diff.cpu.times_avg.idleused.conv_in_outs_sum0.87
72telemetry_diff.cpu.times_avg.idleused.conv_kernel_sizes_sum0.87
73telemetry_diff.cpu.times_avg.idleused.conv_pool_sizes_sum0.87
84telemetry_diff.process.memory.rssused.conv_in_outs_sum-0.87
85telemetry_diff.process.memory.rssused.conv_kernel_sizes_sum-0.87
86telemetry_diff.process.memory.rssused.conv_pool_sizes_sum-0.87
97telemetry_diff.process.memory.pfaultsused.conv_in_outs_sum0.87
98telemetry_diff.process.memory.pfaultsused.conv_kernel_sizes_sum0.87
99telemetry_diff.process.memory.pfaultsused.conv_pool_sizes_sum0.87
108telemetry_diff.process.cpu_times.userused.conv_in_outs_sum0.87
109telemetry_diff.process.cpu_times.userused.conv_kernel_sizes_sum0.87
110telemetry_diff.process.cpu_times.userused.conv_pool_sizes_sum0.87
118telemetry_diff.process.cpu_times.systemused.conv_in_outs_sum0.87
119telemetry_diff.process.cpu_times.systemused.conv_kernel_sizes_sum0.87
120telemetry_diff.process.cpu_times.systemused.conv_pool_sizes_sum0.87
125telemetry_diff.memory.virtual.usedused.conv_in_outs_sum0.88
126telemetry_diff.memory.virtual.usedused.conv_kernel_sizes_sum0.88
127telemetry_diff.memory.virtual.usedused.conv_pool_sizes_sum0.88
128telemetry_diff.memory.virtual.activeused.conv_in_outs_sum0.88
129telemetry_diff.memory.virtual.activeused.conv_kernel_sizes_sum0.88
130telemetry_diff.memory.virtual.activeused.conv_pool_sizes_sum0.88
133telemetry_diff.memory.virtual.inactiveused.conv_in_outs_sum0.87
134telemetry_diff.memory.virtual.inactiveused.conv_kernel_sizes_sum0.87
135telemetry_diff.memory.virtual.inactiveused.conv_pool_sizes_sum0.87
139telemetry_diff.memory.swap.usedused.conv_in_outs_sum-0.96
140telemetry_diff.memory.swap.usedused.conv_kernel_sizes_sum-0.96
141telemetry_diff.memory.swap.usedused.conv_pool_sizes_sum-0.96
147telemetry_diff.memory.swap.freeused.conv_in_outs_sum0.96
148telemetry_diff.memory.swap.freeused.conv_kernel_sizes_sum0.96
149telemetry_diff.memory.swap.freeused.conv_pool_sizes_sum0.96
154telemetry_diff.memory.swap.sinused.conv_in_outs_sum0.88
155telemetry_diff.memory.swap.sinused.conv_kernel_sizes_sum0.88
156telemetry_diff.memory.swap.sinused.conv_pool_sizes_sum0.88
160telemetry_diff.memory.swap.soutused.conv_in_outs_sum0.90
161telemetry_diff.memory.swap.soutused.conv_kernel_sizes_sum0.90
162telemetry_diff.memory.swap.soutused.conv_pool_sizes_sum0.90
168used.conv_in_outs_sumtelemetry_diff.network.activity0.87
169used.conv_in_outs_sumtelemetry_diff.disk.activity0.87
171used.conv_kernel_sizes_sumtelemetry_diff.network.activity0.87
172used.conv_kernel_sizes_sumtelemetry_diff.disk.activity0.87
173used.conv_pool_sizes_sumtelemetry_diff.network.activity0.87
174used.conv_pool_sizes_sumtelemetry_diff.disk.activity0.87
\n", + "
" + ], + "text/plain": [ + " col_1 col_2 \\\n", + "42 telemetry_diff.cpu.times_avg.user used.conv_in_outs_sum \n", + "43 telemetry_diff.cpu.times_avg.user used.conv_kernel_sizes_sum \n", + "44 telemetry_diff.cpu.times_avg.user used.conv_pool_sizes_sum \n", + "57 telemetry_diff.cpu.times_avg.system used.conv_in_outs_sum \n", + "58 telemetry_diff.cpu.times_avg.system used.conv_kernel_sizes_sum \n", + "59 telemetry_diff.cpu.times_avg.system used.conv_pool_sizes_sum \n", + "71 telemetry_diff.cpu.times_avg.idle used.conv_in_outs_sum \n", + "72 telemetry_diff.cpu.times_avg.idle used.conv_kernel_sizes_sum \n", + "73 telemetry_diff.cpu.times_avg.idle used.conv_pool_sizes_sum \n", + "84 telemetry_diff.process.memory.rss used.conv_in_outs_sum \n", + "85 telemetry_diff.process.memory.rss used.conv_kernel_sizes_sum \n", + "86 telemetry_diff.process.memory.rss used.conv_pool_sizes_sum \n", + "97 telemetry_diff.process.memory.pfaults used.conv_in_outs_sum \n", + "98 telemetry_diff.process.memory.pfaults used.conv_kernel_sizes_sum \n", + "99 telemetry_diff.process.memory.pfaults used.conv_pool_sizes_sum \n", + "108 telemetry_diff.process.cpu_times.user used.conv_in_outs_sum \n", + "109 telemetry_diff.process.cpu_times.user used.conv_kernel_sizes_sum \n", + "110 telemetry_diff.process.cpu_times.user used.conv_pool_sizes_sum \n", + "118 telemetry_diff.process.cpu_times.system used.conv_in_outs_sum \n", + "119 telemetry_diff.process.cpu_times.system used.conv_kernel_sizes_sum \n", + "120 telemetry_diff.process.cpu_times.system used.conv_pool_sizes_sum \n", + "125 telemetry_diff.memory.virtual.used used.conv_in_outs_sum \n", + "126 telemetry_diff.memory.virtual.used used.conv_kernel_sizes_sum \n", + "127 telemetry_diff.memory.virtual.used used.conv_pool_sizes_sum \n", + "128 telemetry_diff.memory.virtual.active used.conv_in_outs_sum \n", + "129 telemetry_diff.memory.virtual.active used.conv_kernel_sizes_sum \n", + "130 telemetry_diff.memory.virtual.active used.conv_pool_sizes_sum \n", + "133 telemetry_diff.memory.virtual.inactive used.conv_in_outs_sum \n", + "134 telemetry_diff.memory.virtual.inactive used.conv_kernel_sizes_sum \n", + "135 telemetry_diff.memory.virtual.inactive used.conv_pool_sizes_sum \n", + "139 telemetry_diff.memory.swap.used used.conv_in_outs_sum \n", + "140 telemetry_diff.memory.swap.used used.conv_kernel_sizes_sum \n", + "141 telemetry_diff.memory.swap.used used.conv_pool_sizes_sum \n", + "147 telemetry_diff.memory.swap.free used.conv_in_outs_sum \n", + "148 telemetry_diff.memory.swap.free used.conv_kernel_sizes_sum \n", + "149 telemetry_diff.memory.swap.free used.conv_pool_sizes_sum \n", + "154 telemetry_diff.memory.swap.sin used.conv_in_outs_sum \n", + "155 telemetry_diff.memory.swap.sin used.conv_kernel_sizes_sum \n", + "156 telemetry_diff.memory.swap.sin used.conv_pool_sizes_sum \n", + "160 telemetry_diff.memory.swap.sout used.conv_in_outs_sum \n", + "161 telemetry_diff.memory.swap.sout used.conv_kernel_sizes_sum \n", + "162 telemetry_diff.memory.swap.sout used.conv_pool_sizes_sum \n", + "168 used.conv_in_outs_sum telemetry_diff.network.activity \n", + "169 used.conv_in_outs_sum telemetry_diff.disk.activity \n", + "171 used.conv_kernel_sizes_sum telemetry_diff.network.activity \n", + "172 used.conv_kernel_sizes_sum telemetry_diff.disk.activity \n", + "173 used.conv_pool_sizes_sum telemetry_diff.network.activity \n", + "174 used.conv_pool_sizes_sum telemetry_diff.disk.activity \n", + "\n", + " correlation \n", + "42 0.87 \n", + "43 0.87 \n", + "44 0.87 \n", + "57 0.87 \n", + "58 0.87 \n", + "59 0.87 \n", + "71 0.87 \n", + "72 0.87 \n", + "73 0.87 \n", + "84 -0.87 \n", + "85 -0.87 \n", + "86 -0.87 \n", + "97 0.87 \n", + "98 0.87 \n", + "99 0.87 \n", + "108 0.87 \n", + "109 0.87 \n", + "110 0.87 \n", + "118 0.87 \n", + "119 0.87 \n", + "120 0.87 \n", + "125 0.88 \n", + "126 0.88 \n", + "127 0.88 \n", + "128 0.88 \n", + "129 0.88 \n", + "130 0.88 \n", + "133 0.87 \n", + "134 0.87 \n", + "135 0.87 \n", + "139 -0.96 \n", + "140 -0.96 \n", + "141 -0.96 \n", + "147 0.96 \n", + "148 0.96 \n", + "149 0.96 \n", + "154 0.88 \n", + "155 0.88 \n", + "156 0.88 \n", + "160 0.90 \n", + "161 0.90 \n", + "162 0.90 \n", + "168 0.87 \n", + "169 0.87 \n", + "171 0.87 \n", + "172 0.87 \n", + "173 0.87 \n", + "174 0.87 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations_used_vs_telemetry_diff(df, threshold=0.8)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "5b3c1356-6209-4d92-b87f-d84f00b20041", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col_1col_2correlation
12generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.cpu.times_avg.user0.87
13generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.cpu.times_avg.system0.87
14generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.cpu.times_avg.idle0.87
15generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.process.memory.rss-0.87
16generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.process.memory.pfaults0.87
17generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.process.cpu_times.user0.87
18generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.process.cpu_times.system0.87
19generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.virtual.used0.88
20generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.virtual.active0.88
21generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.virtual.inactive0.87
22generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.swap.used-0.96
23generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.swap.free0.96
24generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.swap.sin0.88
25generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.memory.swap.sout0.90
29generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.network.activity0.87
30generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.disk.activity0.87
31generated.responsible_ai_metadata.n_cv_layerstelemetry_diff.process.activity0.87
\n", + "
" + ], + "text/plain": [ + " col_1 \\\n", + "12 generated.responsible_ai_metadata.n_cv_layers \n", + "13 generated.responsible_ai_metadata.n_cv_layers \n", + "14 generated.responsible_ai_metadata.n_cv_layers \n", + "15 generated.responsible_ai_metadata.n_cv_layers \n", + "16 generated.responsible_ai_metadata.n_cv_layers \n", + "17 generated.responsible_ai_metadata.n_cv_layers \n", + "18 generated.responsible_ai_metadata.n_cv_layers \n", + "19 generated.responsible_ai_metadata.n_cv_layers \n", + "20 generated.responsible_ai_metadata.n_cv_layers \n", + "21 generated.responsible_ai_metadata.n_cv_layers \n", + "22 generated.responsible_ai_metadata.n_cv_layers \n", + "23 generated.responsible_ai_metadata.n_cv_layers \n", + "24 generated.responsible_ai_metadata.n_cv_layers \n", + "25 generated.responsible_ai_metadata.n_cv_layers \n", + "29 generated.responsible_ai_metadata.n_cv_layers \n", + "30 generated.responsible_ai_metadata.n_cv_layers \n", + "31 generated.responsible_ai_metadata.n_cv_layers \n", + "\n", + " col_2 correlation \n", + "12 telemetry_diff.cpu.times_avg.user 0.87 \n", + "13 telemetry_diff.cpu.times_avg.system 0.87 \n", + "14 telemetry_diff.cpu.times_avg.idle 0.87 \n", + "15 telemetry_diff.process.memory.rss -0.87 \n", + "16 telemetry_diff.process.memory.pfaults 0.87 \n", + "17 telemetry_diff.process.cpu_times.user 0.87 \n", + "18 telemetry_diff.process.cpu_times.system 0.87 \n", + "19 telemetry_diff.memory.virtual.used 0.88 \n", + "20 telemetry_diff.memory.virtual.active 0.88 \n", + "21 telemetry_diff.memory.virtual.inactive 0.87 \n", + "22 telemetry_diff.memory.swap.used -0.96 \n", + "23 telemetry_diff.memory.swap.free 0.96 \n", + "24 telemetry_diff.memory.swap.sin 0.88 \n", + "25 telemetry_diff.memory.swap.sout 0.90 \n", + "29 telemetry_diff.network.activity 0.87 \n", + "30 telemetry_diff.disk.activity 0.87 \n", + "31 telemetry_diff.process.activity 0.87 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.analyze_correlations_generated_vs_telemetry_diff(df, threshold=0.8)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "bae58142-3f70-4df8-a57a-4f75eef0cca8", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'label': 'generated.loss',\n", + " 'mean': '0.04',\n", + " 'std': '0.02',\n", + " 'min': '0.01',\n", + " '25%': '0.02',\n", + " '50%': '0.04',\n", + " '75%': '0.04',\n", + " 'max': '0.06'}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "analytics.describe_col(df, col='generated.loss')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "f9a5bdd4-b5ed-441d-9b96-bdd57fe89bd6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labelmeanstdmin25%50%75%max
0Loss0.040.020.010.020.040.040.06
1#Params13.47M18.57M162.99K1.51M5.29M17.06M43.93M
\n", + "
" + ], + "text/plain": [ + " label mean std min 25% 50% 75% max\n", + "0 Loss 0.04 0.02 0.01 0.02 0.04 0.04 0.06\n", + "1 #Params 13.47M 18.57M 162.99K 1.51M 5.29M 17.06M 43.93M" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "analytics.describe_cols(df, cols=['generated.loss','generated.responsible_ai_metrics.params'], col_labels=['Loss', '#Params'])" + "analytics.describe_cols(df, cols=['generated.loss','generated.responsible_ai_metadata.params'], col_labels=['Loss', '#Params'])" ] }, { @@ -402,12 +5300,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "c369915d-b12d-4bf7-b0f4-02e5b5be8a9b", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of columns originally: 334\n", + "Number of columns later: 39\n" + ] + } + ], "source": [ "_filter = {\n", " \"workflow_id\": wf_id\n", @@ -417,14 +5324,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "e765a93d-a005-4d77-9d42-4acde84bb72a", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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gAE0btyYX3/9laNHj/LGG28oMfT09HjvvfdYvnw5NWrUYMKECbRv317pjAwKCmLQoEG4urri6enJd999x+bNm0vsMFye2bNn4+7uTsuWLcnLy+P777+vsCNo7ty51KpVC2traz744ANq165Nv379yozfp08fGjZsyIABA9DR0SElJYXU1NQSm6s8rlmzZhQUFPDJJ5/g4+NDUlISX3zxRaXvTRsqeo5t2rTBzs6OS5cucfLkSRo0aICpqWmlcp84cSIdO3YkNDSUvn37snPnTuLj4zWusbe3Z/Pmzfj4+KBSqZg1a1aJUXl2dnbs37+fIUOGYGBgQO3atSv1HVmxYgVbtmxh7969AAQEBNCzZ08cHBy4fv06+/btq3SnYGVzhYedlB9//DH9+vVj9+7dfP3118TFxVUYPyoqisLCQjw8PDA2NubLL7/EyMiIRo0aAdC9e3dWrFhBhw4dKCws5P333y8xqlUIIYQQQgghxLPtRd1V+llVpbtdL1myhA4dOtCnTx88PT3p2LEjTk5OylTZyMhI/Pz8mDp1Ko6OjvTr109jpGRljB49moiICCIjI3F2dqZLly5ERUXRuHHjcsvNnDkTNzc3vLy86Nq1K3Xr1i3R+RUYGIiuri4tWrTAysqKrKws6tWrR1JSEoWFhbz22ms4OzsTEBCAhYWF0sG4ePFiOnXqhI+PD56enrzyyiu4u7trxM7Ozq5wzT2VSsX27dvp3LkzI0eOxMHBgSFDhnD58mWsra3R1dXl2rVr+Pn54eDgwKBBg+jZsychISFKDGNjY95//32GDRtGx44dUavVbNiwQTnfr18/wsPDCQ0NpWXLlqxcuZLIyEi6du1aidZ/SF9fnxkzZtCqVSs6d+6Mrq4usbGx5Zb56KOPmDRpEu7u7vz+++9899136Ovrl3qtl5cX33//Pbt27aJt27a0b9+epUuXKh1G5XFxcWHJkiUsWrSIl156iZiYmH98bb2KniPAG2+8gbe3N926dcPKyor169dXKvf27duzatUqwsPDcXFxYdeuXcycOVPjmiVLllCzZk1efvllfHx88PLyws3NTeOauXPnkpmZSdOmTZV1RyvzHfnzzz811q0sLCxk/PjxODk54e3tjYODA5999lml26oyuQJMnTqVY8eO4erqyocffsiSJUvw8vKqML6FhQWrVq2iY8eOtGrVij17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ycnJYevWreWWXb16NfXq1SM5OZkPPviA9957j379+tGpUyeOHz9Ot27dGDx4MAUFBQDcuHGjwucpJycHf39/hg0bRlpaGgkJCfTp06dSw71v3brFkCFD+O677zh69Ch2dnb06NGDW7duARAQEMDXX39NXl6ecszevXspKCigd+/eAIwdO5bExER27txJfHw8hw8f1khgVsb8+fOJjY1l1apVfPfdd/zxxx9s27atwmMq884IIYQQQgghhPgb1ajx9H5eQDLs+jlhYWGBgYEBJiYmypDhmTNn4urqyqxZs5Ryq1atomHDhmRkZGBvb68RIzs7m5iYGLKzs7G2tgbuz4kXFxdHTEyMEqeoqIglS5bQrFkzAPr27cvatWu5cuUKarWaFi1a0LlzZw4ePMiAAQMqFdfCwgKVSlVquDNAly5dCAsLU77b2NgQEhLCjh07lMRXbGwsQUFBFfYKBMjIyGDPnj0kJyfTrl07AFauXImTk1O5x9SvXx99fX3UarVSP7VaXWrbg27dukVUVBSLFy9myJAhADRr1oxXX31Vo1xISAhvv/02AEuWLCEuLo6VK1cyfvz4Cq+jPJaWlgDUrVu3zHo9yMXFhUmTJgH/S5TWq1ePESNGADBlyhSWLFnC6dOn6dixI4sXL67wecrLy+POnTv06dNHGYru7OxcqXo/nDT+97//Ta1atTh06BA9e/bEx8cHU1NTtm3bxuDBgwHYsGEDb775JmZmZty6dYvVq1ezYcMGunbtCkBMTIzyvFXWokWLmDhxIn369AFg6dKl7N27t9zylX1nhBBCCCGEEEKIF5UkH59jp06d4uDBg2XOaZeZmVkq+XjmzBmKi4tLbS8sLKRu3brKdxMTEyXxCGBlZYWtra3GeaysrJTehJWNW562bdtqfDcyMmLw4MGsWrWK/v37c/z4cc6ePcvOnTu1xkpLS0NfX582bdoo2xwdHUsNb35caWlpFBYWKomw8ri7uys/6+vr07ZtW9LS0nRal/K0atVK+VlPT4+6detqJAtLemmWtKO256lbt2507doVZ2dnfHx86NatG3379tVYuKc8V65cYdKkSSQkJJCbm0txcTEFBQVkZ2cD9+9N//79Wb9+PYMHDyY/P58dO3awadMmAC5dukRRURHt27dXYlpYWODg4FDp+3Hz5k1ycnLo0KGDsq2kTcrrvfmoz3Zh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hBBCCCGEeH6oVNVdA/EAST4KIcRzyrjolk7j/fPiOJ3GA8D3U52HXGkfrfOYuuZpfl3nMQ/b++g0nq/xLzqNBzDDKUbnMQteztd5zGfBmE26XY28XSPdrqYM8E8dr8gNsPTHYTqN9+4TqOOT4OGk25XDf6z5h07jAXjWsdJ5zENNB+k0Xj0rM53GA5j623idx4T5Oo32JFamnumi+z/P823/1Gm8Gnq6X+16Hk10HnPWE/i78VkwvH5TncazM/5Np/EAop7A3xEFN3T7nJu4mus0HsAbOo8oBMgMnEIIIYQQQgghhBBCiCdCej4KIYQQQgghhBBCiOeHSvraPU2kNV4AXl5ehIaGVnc1qp2trS2LFi1SvqtUKrZv3658v3DhAh07dsTIyIjWrVuXu00IIYQQQgghhBBCVI70fHzGeHl50bp1a40k2rMiNjaW0NBQbty4Ud1VASAnJ4fatWsr36dOnYqpqSnp6emo1epytwkhhBBCCCGEEEKIypHko3jq3L59GwMDgyd+nvr162t8z8zM5I033qBx48YVbntcf9f1if8pKiqiZs2aj3y8tJkQQgghhBBCPENkteunigy7foYEBQVx6NAhoqKiUKlUqFQqsrKyOHv2LN27d0etVmNlZcXgwYO5evVquXEKCwsJDw/HxsYGU1NTOnToQEJCgrI/NjaWWrVq8c033+Dg4ICJiQl9+/aloKCA1atXY2trS+3atRk9ejTFxcWVipuQkMDQoUO5efOmUvdp06YB94dDz5gxg8DAQMzNzRk5ciRdunQhJCREo96///47BgYGHDhwQOu9ys3Nxc/PD2NjY5o0acL69etLlXlw2LVKpSI1NZXp06crdStr28O8vLwICQkhJCQECwsL6tWrx+TJk7l3755SpqzrA/jqq69o2bIlhoaG2NraMn++5sqGhYWFfPTRRzRs2BBDQ0OaN2/OypUrlf3a2n3Lli04OztjbGxM3bp18fb2Jj8/X2mP9u3bY2pqSq1atfDw8ODy5ctl3susrCxUKhVffvklr732GsbGxrRr146MjAxSUlJo27YtarWa7t278/vvv2scu2LFCpycnDAyMsLR0ZEvvvjisePevXuX6dOn8/LLL2NoaEjr1q2Ji4srFXfz5s14enpiZGTEv//9b8zNzdmyZYtG/bZv346pqSm3bmmuCl3SrqGhodSrVw8f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cvdDbXJ///13fv311wrPXWZmpt62u895jx496NSpkzLycv369bRp04Znn322wuOt7rqmp6czZMgQWrdujaWlpXKt8vLyAMjKylKK33f24U4ZGRnExMTonSNvb29KS0s5c+ZMhf0C/XNmbm6OlZWVco5ee+014uLicHFx4e233+bQoUOV5sCt6f2///673uvOEcdCCCGEEEIIIe5dmUbz0L6eRDLy8R4UFhYyZMgQFixYUO6z5s2bV9jewMCA9PR0DAwM9D67s7B49+IcGo2mwm2lpaW1yq1MRav5BgcH4+Liws8//4xOp8PLy0vVhV/+TrVdrdjU1LTKz6u77gYGBuzbt49Dhw7x1Vdf8dFHH/Huu++SkpKCvb09Op2OSZMmER8fz+eff05kZCT79u3D3d290u+88/rfLsrdve3O+wFg1apV9OzZUy/n7vujNrm1Udk99fHHHzNlyhR0Oh1jxoypdiRtRa5du4a3tzfe3t5s2LABa2tr8vLy8Pb25saNGzXOKSwsZPz48UyaNKncZ61bt650v6p+FgcNGsTZs2fZvXs3+/bto1+/fkycOJFFixZVmDVv3jxmzpypt23GjBkVPuNUCCGEEEIIIYR4lEnxsQaMjIz0RtS5ubmxZcsWtFothobVn0JXV1dKSkq4cOECzzzzjGr9qknu3X2vjrOzM926dWPVqlXExsaybNmyGu3n5OTEzZs3SU9PV0aeZWVl6S3yoaaUlBS999999x3t27cvV2S7U4cOHUhKStLblpSUhIODAwYGBjg7O1NaWkpiYqIy7fpONbnuGo2GPn360KdPH6ZPn06bNm348ssvmTx5MnDrmrm6ujJ16lR69epFbGxslcXH2rCxsaFFixb89NNPBAQEqJIJYGVlRYsWLUhKStIbFZqUlFRuVGFF/vnPf/L222+zdOlSTp48qTf9+25VXddTp05x6dIl5s+fT6tWrQA4fPiwXntHR0d2796tty0tLU3vvZubGydPnqRdu3bV9r02rK2tGT16NKNHj+aZZ57hrbfeqrT4OHXqVOWeuM3Y2FjV/gghhBBCCCGEEA8DmXZdA1qtlpSUFHJzcykoKGDixIlcvnwZf39/0tLSyMnJYe/evYwZM6bCQp+DgwMBAQEEBgaydetWzpw5Q2pqKvPmzWPXrl333K+a5Gq1WgoLC9m/fz8FBQUUFRVVmxsc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UldXp6FDh9LZs2eJiKi4uJhmz55NJiYmrOMryvPnz6l3796S/VvNb9Hf35+mT5+uUOysrCyKiYmh0tJSIiKqqqpiHSstLY0MDAzI1dWVGjRoQIMHDyZra2syNDSkBw8eMI7HxzZpaGhIycnJRCS9X8vOzmZ1zOGTixcv0g8//EAtW7akli1bkpubG126dEmhmA8ePKDAwED69ttvydramnx8fCg1NZWjGddN7e+5Lj48Hn7swQQnJydycnIikUhEXbt2lfzt5OREzs7ONGbMGMkx7t/Ap75HR0dHevnyJRERBQcHU0lJyeeamoDAJxF6PgoICAh8xairq+PBgwdo3rw5xowZA01NTaxbtw45OTlo164db43BvzYePXqEO3fuwNLSEvb29l96OgCq1QMLFixAmzZtZPrMse2/9SVdvrko5WEL10Y7XBu5APz0RqvtIg78n/txp06dWLVVeP/+PUaOHIkDBw5InJOrqqrg6+uLLVu2oEGDBoxj9u/fH9988w2WLFkCLS0tpKamwtTUFEOHDkVVVRUOHjzIOCbXJc11qVFFIpFChjNisRjp6ekwMzPDwIED0a1bN8yZMwd5eXlo06YNKyMtExMT/PHHH7Czs5MaT01NRf/+/SXmKV8SPoyVuO5VyHUvRaDaaTY2NhatW7dGYGAgfH190ahRI6nX/P3332jatCmjUlgujVL4MHLhq6fr69evsWnTJqSkpEhakkyYMAFGRkaMY/GxTWppaSExMRGtWrWS6kV4+/ZtuLi41Hn8/RRxcXH1buubN2/GhAkTGMfctWsX/P394enpKWkxcPXqVRw5cgQREREYPnw445jp6emwtbWt87mjR49yXi1Rw6d6PtY+Hn6qFYu81RAbNmzA6NGjoaGhAX9/f6xfvx7a2tqKf5gvyKe+Rw0NDWRlZaF58+b19rkUEPhifOHkp4CAgIDARzAxMaHY2FiqqKigFi1a0MmTJ4mIKD09nXR1db/w7KopLCykESNGkJGRESkrK3OiMouMjKSysjKZ8X/++YciIyPljqOnp0fPnj0jok/fVWeKgYEBhYeHM37fxxg/fjxZW1vTwYMHSUNDg3bs2EFLliyh5s2b065duzhd1od86m56XXClzgwPDydlZWX64YcfaMmSJbRkyRL64YcfSEVFhdPvePfu3TRw4EBW762tlvjw0atXL87myAX3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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "analytics.heatmap(df)" + "flow_plot.heatmap(df)" ] }, { @@ -437,20 +5355,2893 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6bb073fa-6e17-403e-8c9f-3884b86119f5", + "execution_count": 23, + "id": "4613ace3-ab5a-4553-9629-ac94daa30c0f", "metadata": { "tags": [] }, "outputs": [], + "source": [ + "df.to_csv('sample_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "6bb073fa-6e17-403e-8c9f-3884b86119f5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "0.01", + "397.45", + "162.99K" + ], + [ + "0.04", + "411.42", + "359.84K" + ], + [ + "0.06", + "1.18K", + "42.18M" + ], + [ + "0.02", + "1.86K", + "1.89M" + ], + [ + "0.04", + "1.88K", + "2.09M" + ], + [ + "0.06", + "2.38K", + "43.93M" + ], + [ + "0.02", + "4.17K", + "8.49M" + ], + [ + "0.04", + "4.17K", + "8.69M" + ], + [ + "nan", + "nan", + "nan" + ] + ], + "hovertemplate": "Loss: %{customdata[0]}
User CPU: %{customdata[1]}
#Params: %{customdata[2]}", + "marker": { + "color": [ + 162990, + 359840, + 42184840, + 1890690, + 2089540, + 43930540, + 8485880, + 8687730, + null + ], + "colorbar": { + "orientation": "v", + "title": { + "text": "#Params" + } + }, + "colorscale": [ + [ + 0, + "rgb(255,245,240)" + ], + [ + 0.125, + "rgb(254,224,210)" + ], + [ + 0.25, + "rgb(252,187,161)" + ], + [ + 0.375, + "rgb(252,146,114)" + ], + [ + 0.5, + "rgb(251,106,74)" + ], + [ + 0.625, + "rgb(239,59,44)" + ], + [ + 0.75, + "rgb(203,24,29)" + ], + [ + 0.875, + "rgb(165,15,21)" + ], + [ + 1, + "rgb(103,0,13)" + ] + ], + "opacity": 0.8, + "reversescale": false, + "size": 5 + }, + "mode": "markers", + "name": "", + "type": "scatter", + "x": [ + 0.014728536784648895, + 0.040325844478607174, + 0.05815730080604553, + 0.018241909003257752, + 0.040312224340438844, + 0.05813799858093262, + 0.018207813382148743, + 0.04012699522972107, + null + ], + "y": [ + 397.4499999999971, + 411.41999999999825, + 1179.7599999999948, + 1862.6100000000006, + 1875.5800000000017, + 2384.9100000000035, + 4169.770000000004, + 4172.880000000005, + null + ] + }, + { + "marker": { + "color": "darkred", + "opacity": 0.5, + "size": 1 + }, + "mode": "markers", + "name": "", + "type": "scatter", + "x": [ + 0.014728536784648895, + 0.014776844642292272, + 0.01482515249993565, + 0.014873460357579029, + 0.014921768215222406, + 0.014970076072865783, + 0.015018383930509163, + 0.01506669178815254, + 0.015114999645795917, + 0.015163307503439295, + 0.015211615361082672, + 0.015259923218726051, + 0.015308231076369428, + 0.015356538934012806, + 0.015404846791656185, + 0.015453154649299562, + 0.01550146250694294, + 0.015549770364586317, + 0.015598078222229694, + 0.01564638607987307, + 0.01569469393751645, + 0.01574300179515983, + 0.015791309652803207, + 0.015839617510446585, + 0.015887925368089962, + 0.01593623322573334, + 0.015984541083376717, + 0.016032848941020094, + 0.016081156798663475, + 0.016129464656306852, + 0.01617777251395023, + 0.016226080371593607, + 0.016274388229236984, + 0.01632269608688036, + 0.01637100394452374, + 0.016419311802167116, + 0.016467619659810494, + 0.016515927517453875, + 0.016564235375097252, + 0.01661254323274063, + 0.016660851090384007, + 0.016709158948027384, + 0.01675746680567076, + 0.01680577466331414, + 0.01685408252095752, + 0.016902390378600897, + 0.016950698236244274, + 0.01699900609388765, + 0.01704731395153103, + 0.017095621809174406, + 0.017143929666817784, + 0.01719223752446116, + 0.01724054538210454, + 0.01728885323974792, + 0.017337161097391297, + 0.017385468955034674, + 0.01743377681267805, + 0.01748208467032143, + 0.017530392527964806, + 0.017578700385608183, + 0.017627008243251564, + 0.01767531610089494, + 0.01772362395853832, + 0.017771931816181696, + 0.017820239673825074, + 0.01786854753146845, + 0.01791685538911183, + 0.017965163246755206, + 0.018013471104398583, + 0.018061778962041964, + 0.01811008681968534, + 0.01815839467732872, + 0.018206702534972096, + 0.018255010392615473, + 0.01830331825025885, + 0.018351626107902228, + 0.01839993396554561, + 0.018448241823188986, + 0.018496549680832364, + 0.01854485753847574, + 0.01859316539611912, + 0.018641473253762496, + 0.018689781111405873, + 0.01873808896904925, + 0.018786396826692628, + 0.018834704684336005, + 0.018883012541979386, + 0.018931320399622763, + 0.01897962825726614, + 0.019027936114909518, + 0.019076243972552896, + 0.019124551830196276, + 0.019172859687839654, + 0.01922116754548303, + 0.01926947540312641, + 0.019317783260769786, + 0.019366091118413163, + 0.01941439897605654, + 0.019462706833699918, + 0.019511014691343295, + 0.019559322548986673, + 0.01960763040663005, + 0.01965593826427343, + 0.019704246121916808, + 0.019752553979560186, + 0.019800861837203563, + 0.01984916969484694, + 0.01989747755249032, + 0.0199457854101337, + 0.019994093267777076, + 0.020042401125420453, + 0.02009070898306383, + 0.020139016840707208, + 0.020187324698350585, + 0.020235632555993963, + 0.02028394041363734, + 0.020332248271280717, + 0.020380556128924095, + 0.020428863986567476, + 0.020477171844210853, + 0.02052547970185423, + 0.020573787559497608, + 0.020622095417140985, + 0.020670403274784366, + 0.020718711132427743, + 0.02076701899007112, + 0.020815326847714498, + 0.020863634705357875, + 0.020911942563001253, + 0.02096025042064463, + 0.021008558278288007, + 0.021056866135931385, + 0.021105173993574762, + 0.02115348185121814, + 0.02120178970886152, + 0.021250097566504898, + 0.021298405424148275, + 0.021346713281791652, + 0.02139502113943503, + 0.02144332899707841, + 0.021491636854721788, + 0.021539944712365165, + 0.021588252570008543, + 0.02163656042765192, + 0.021684868285295297, + 0.021733176142938675, + 0.021781484000582052, + 0.02182979185822543, + 0.021878099715868807, + 0.021926407573512184, + 0.021974715431155565, + 0.022023023288798942, + 0.02207133114644232, + 0.022119639004085697, + 0.022167946861729074, + 0.022216254719372455, + 0.022264562577015833, + 0.02231287043465921, + 0.022361178292302587, + 0.022409486149945965, + 0.022457794007589342, + 0.02250610186523272, + 0.022554409722876097, + 0.022602717580519474, + 0.02265102543816285, + 0.02269933329580623, + 0.02274764115344961, + 0.022795949011092987, + 0.022844256868736364, + 0.022892564726379742, + 0.02294087258402312, + 0.0229891804416665, + 0.023037488299309877, + 0.023085796156953255, + 0.023134104014596632, + 0.02318241187224001, + 0.023230719729883387, + 0.023279027587526764, + 0.02332733544517014, + 0.02337564330281352, + 0.023423951160456896, + 0.023472259018100274, + 0.023520566875743654, + 0.02356887473338703, + 0.02361718259103041, + 0.023665490448673786, + 0.023713798306317164, + 0.023762106163960545, + 0.023810414021603922, + 0.0238587218792473, + 0.023907029736890677, + 0.023955337594534054, + 0.02400364545217743, + 0.02405195330982081, + 0.024100261167464186, + 0.024148569025107564, + 0.02419687688275094, + 0.024245184740394318, + 0.0242934925980377, + 0.024341800455681076, + 0.024390108313324454, + 0.02443841617096783, + 0.02448672402861121, + 0.02453503188625459, + 0.024583339743897967, + 0.024631647601541344, + 0.02467995545918472, + 0.0247282633168281, + 0.024776571174471476, + 0.024824879032114854, + 0.02487318688975823, + 0.024921494747401608, + 0.024969802605044986, + 0.025018110462688363, + 0.025066418320331744, + 0.02511472617797512, + 0.0251630340356185, + 0.025211341893261876, + 0.025259649750905253, + 0.025307957608548634, + 0.02535626546619201, + 0.02540457332383539, + 0.025452881181478766, + 0.025501189039122144, + 0.02554949689676552, + 0.025597804754408898, + 0.025646112612052276, + 0.025694420469695653, + 0.02574272832733903, + 0.025791036184982408, + 0.02583934404262579, + 0.025887651900269166, + 0.025935959757912543, + 0.02598426761555592, + 0.026032575473199298, + 0.02608088333084268, + 0.026129191188486056, + 0.026177499046129434, + 0.02622580690377281, + 0.026274114761416188, + 0.026322422619059566, + 0.026370730476702943, + 0.02641903833434632, + 0.026467346191989698, + 0.026515654049633075, + 0.026563961907276452, + 0.026612269764919833, + 0.02666057762256321, + 0.026708885480206588, + 0.026757193337849965, + 0.026805501195493343, + 0.026853809053136724, + 0.0269021169107801, + 0.026950424768423478, + 0.026998732626066856, + 0.027047040483710233, + 0.02709534834135361, + 0.027143656198996988, + 0.027191964056640365, + 0.027240271914283742, + 0.02728857977192712, + 0.027336887629570497, + 0.027385195487213878, + 0.027433503344857255, + 0.027481811202500633, + 0.02753011906014401, + 0.027578426917787387, + 0.027626734775430768, + 0.027675042633074146, + 0.027723350490717523, + 0.0277716583483609, + 0.027819966206004278, + 0.027868274063647655, + 0.027916581921291032, + 0.02796488977893441, + 0.028013197636577787, + 0.028061505494221164, + 0.028109813351864542, + 0.028158121209507923, + 0.0282064290671513, + 0.028254736924794677, + 0.028303044782438055, + 0.028351352640081432, + 0.028399660497724813, + 0.02844796835536819, + 0.028496276213011568, + 0.028544584070654945, + 0.028592891928298322, + 0.0286411997859417, + 0.028689507643585077, + 0.028737815501228454, + 0.028786123358871832, + 0.02883443121651521, + 0.028882739074158587, + 0.028931046931801967, + 0.028979354789445345, + 0.029027662647088722, + 0.0290759705047321, + 0.029124278362375477, + 0.029172586220018858, + 0.029220894077662235, + 0.029269201935305612, + 0.02931750979294899, + 0.029365817650592367, + 0.029414125508235744, + 0.029462433365879122, + 0.0295107412235225, + 0.029559049081165877, + 0.029607356938809254, + 0.02965566479645263, + 0.029703972654096012, + 0.02975228051173939, + 0.029800588369382767, + 0.029848896227026144, + 0.02989720408466952, + 0.029945511942312902, + 0.02999381979995628, + 0.030042127657599657, + 0.030090435515243034, + 0.030138743372886412, + 0.03018705123052979, + 0.030235359088173167, + 0.030283666945816544, + 0.03033197480345992, + 0.0303802826611033, + 0.03042859051874668, + 0.030476898376390057, + 0.030525206234033434, + 0.03057351409167681, + 0.03062182194932019, + 0.030670129806963566, + 0.030718437664606944, + 0.030766745522250324, + 0.030815053379893702, + 0.03086336123753708, + 0.030911669095180457, + 0.030959976952823834, + 0.03100828481046721, + 0.03105659266811059, + 0.031104900525753966, + 0.031153208383397343, + 0.031201516241040724, + 0.0312498240986841, + 0.03129813195632748, + 0.03134643981397085, + 0.03139474767161424, + 0.03144305552925761, + 0.03149136338690099, + 0.03153967124454437, + 0.031587979102187747, + 0.031636286959831124, + 0.0316845948174745, + 0.03173290267511788, + 0.031781210532761256, + 0.03182951839040463, + 0.03187782624804801, + 0.03192613410569139, + 0.031974441963334765, + 0.03202274982097815, + 0.03207105767862152, + 0.032119365536264904, + 0.032167673393908275, + 0.03221598125155166, + 0.03226428910919503, + 0.032312596966838414, + 0.03236090482448179, + 0.03240921268212517, + 0.032457520539768546, + 0.03250582839741192, + 0.0325541362550553, + 0.03260244411269868, + 0.032650751970342055, + 0.03269905982798543, + 0.03274736768562882, + 0.03279567554327219, + 0.03284398340091557, + 0.03289229125855894, + 0.032940599116202327, + 0.0329889069738457, + 0.03303721483148908, + 0.03308552268913246, + 0.033133830546775836, + 0.03318213840441921, + 0.03323044626206259, + 0.03327875411970597, + 0.033327061977349345, + 0.03337536983499272, + 0.0334236776926361, + 0.03347198555027948, + 0.033520293407922855, + 0.03356860126556624, + 0.03361690912320961, + 0.033665216980852994, + 0.033713524838496364, + 0.03376183269613975, + 0.03381014055378312, + 0.0338584484114265, + 0.03390675626906988, + 0.03395506412671326, + 0.034003371984356635, + 0.03405167984200001, + 0.03409998769964339, + 0.03414829555728677, + 0.034196603414930145, + 0.03424491127257352, + 0.034293219130216906, + 0.03434152698786028, + 0.03438983484550366, + 0.03443814270314703, + 0.034486450560790416, + 0.034534758418433786, + 0.03458306627607717, + 0.03463137413372055, + 0.034679681991363925, + 0.0347279898490073, + 0.03477629770665068, + 0.03482460556429406, + 0.034872913421937435, + 0.03492122127958081, + 0.03496952913722419, + 0.03501783699486757, + 0.035066144852510944, + 0.03511445271015433, + 0.0351627605677977, + 0.03521106842544108, + 0.035259376283084454, + 0.03530768414072784, + 0.03535599199837121, + 0.03540429985601459, + 0.03545260771365797, + 0.03550091557130135, + 0.035549223428944725, + 0.0355975312865881, + 0.03564583914423148, + 0.03569414700187486, + 0.035742454859518234, + 0.03579076271716161, + 0.035839070574804996, + 0.035887378432448366, + 0.03593568629009175, + 0.03598399414773512, + 0.036032302005378505, + 0.036080609863021876, + 0.03612891772066526, + 0.03617722557830864, + 0.036225533435952015, + 0.03627384129359539, + 0.03632214915123877, + 0.03637045700888215, + 0.036418764866525524, + 0.0364670727241689, + 0.03651538058181228, + 0.036563688439455656, + 0.036611996297099034, + 0.03666030415474242, + 0.03670861201238579, + 0.03675691987002917, + 0.03680522772767254, + 0.03685353558531593, + 0.0369018434429593, + 0.03695015130060268, + 0.03699845915824606, + 0.03704676701588944, + 0.037095074873532814, + 0.03714338273117619, + 0.03719169058881957, + 0.037239998446462946, + 0.037288306304106324, + 0.0373366141617497, + 0.037384922019393085, + 0.037433229877036456, + 0.03748153773467984, + 0.03752984559232321, + 0.037578153449966595, + 0.037626461307609965, + 0.03767476916525335, + 0.03772307702289673, + 0.037771384880540104, + 0.03781969273818348, + 0.03786800059582686, + 0.037916308453470236, + 0.037964616311113614, + 0.03801292416875699, + 0.03806123202640037, + 0.038109539884043746, + 0.03815784774168712, + 0.03820615559933051, + 0.03825446345697388, + 0.03830277131461726, + 0.03835107917226063, + 0.03839938702990402, + 0.03844769488754739, + 0.03849600274519077, + 0.03854431060283415, + 0.038592618460477526, + 0.038640926318120904, + 0.03868923417576428, + 0.03873754203340766, + 0.038785849891051036, + 0.03883415774869441, + 0.03888246560633779, + 0.038930773463981175, + 0.038979081321624545, + 0.03902738917926793, + 0.0390756970369113, + 0.039124004894554684, + 0.039172312752198055, + 0.03922062060984144, + 0.039268928467484816, + 0.039317236325128194, + 0.03936554418277157, + 0.03941385204041495, + 0.039462159898058326, + 0.0395104677557017, + 0.03955877561334508, + 0.03960708347098846, + 0.039655391328631835, + 0.03970369918627521, + 0.0397520070439186, + 0.03980031490156197, + 0.03984862275920535, + 0.03989693061684872, + 0.039945238474492106, + 0.03999354633213548, + 0.04004185418977886, + 0.04009016204742224, + 0.040138469905065616, + 0.04018677776270899, + 0.04023508562035237, + 0.04028339347799575, + 0.040331701335639125, + 0.0403800091932825, + 0.04042831705092588, + 0.040476624908569264, + 0.040524932766212635, + 0.04057324062385602, + 0.04062154848149939, + 0.040669856339142774, + 0.040718164196786144, + 0.04076647205442953, + 0.040814779912072906, + 0.04086308776971628, + 0.04091139562735966, + 0.04095970348500304, + 0.041008011342646415, + 0.04105631920028979, + 0.04110462705793317, + 0.04115293491557655, + 0.041201242773219925, + 0.0412495506308633, + 0.041297858488506686, + 0.04134616634615006, + 0.04139447420379344, + 0.04144278206143681, + 0.041491089919080196, + 0.041539397776723566, + 0.04158770563436695, + 0.04163601349201033, + 0.041684321349653705, + 0.04173262920729708, + 0.04178093706494046, + 0.04182924492258384, + 0.041877552780227215, + 0.04192586063787059, + 0.04197416849551397, + 0.042022476353157354, + 0.042070784210800724, + 0.04211909206844411, + 0.04216739992608748, + 0.04221570778373086, + 0.042264015641374234, + 0.04231232349901762, + 0.042360631356660995, + 0.04240893921430437, + 0.04245724707194775, + 0.04250555492959113, + 0.042553862787234505, + 0.04260217064487788, + 0.04265047850252126, + 0.04269878636016464, + 0.042747094217808014, + 0.04279540207545139, + 0.042843709933094776, + 0.042892017790738146, + 0.04294032564838153, + 0.0429886335060249, + 0.043036941363668285, + 0.043085249221311656, + 0.04313355707895504, + 0.04318186493659842, + 0.043230172794241795, + 0.04327848065188517, + 0.04332678850952855, + 0.04337509636717193, + 0.043423404224815304, + 0.04347171208245868, + 0.04352001994010206, + 0.04356832779774544, + 0.043616635655388813, + 0.0436649435130322, + 0.04371325137067557, + 0.04376155922831895, + 0.04380986708596232, + 0.04385817494360571, + 0.043906482801249085, + 0.04395479065889246, + 0.04400309851653584, + 0.04405140637417922, + 0.044099714231822594, + 0.04414802208946597, + 0.04419632994710935, + 0.044244637804752726, + 0.044292945662396103, + 0.04434125352003948, + 0.044389561377682865, + 0.044437869235326236, + 0.04448617709296962, + 0.04453448495061299, + 0.044582792808256375, + 0.044631100665899745, + 0.04467940852354313, + 0.04472771638118651, + 0.044776024238829884, + 0.04482433209647326, + 0.04487263995411664, + 0.044920947811760016, + 0.044969255669403393, + 0.04501756352704677, + 0.04506587138469015, + 0.04511417924233353, + 0.0451624870999769, + 0.04521079495762029, + 0.04525910281526366, + 0.04530741067290704, + 0.04535571853055041, + 0.0454040263881938, + 0.045452334245837174, + 0.04550064210348055, + 0.04554894996112393, + 0.045597257818767306, + 0.04564556567641068, + 0.04569387353405406, + 0.04574218139169744, + 0.045790489249340816, + 0.04583879710698419, + 0.04588710496462757, + 0.045935412822270955, + 0.045983720679914325, + 0.0460320285375577, + 0.04608033639520109, + 0.046128644252844464, + 0.04617695211048784, + 0.04622525996813122, + 0.046273567825774596, + 0.04632187568341797, + 0.04637018354106135, + 0.04641849139870473, + 0.046466799256348106, + 0.04651510711399148, + 0.04656341497163486, + 0.04661172282927824, + 0.046660030686921615, + 0.04670833854456499, + 0.04675664640220837, + 0.046804954259851754, + 0.04685326211749513, + 0.04690156997513851, + 0.046949877832781886, + 0.04699818569042526, + 0.04704649354806864, + 0.04709480140571202, + 0.047143109263355396, + 0.04719141712099877, + 0.04723972497864215, + 0.04728803283628553, + 0.047336340693928905, + 0.04738464855157228, + 0.04743295640921566, + 0.04748126426685904, + 0.047529572124502414, + 0.04757787998214579, + 0.047626187839789176, + 0.04767449569743255, + 0.04772280355507593, + 0.04777111141271931, + 0.047819419270362686, + 0.04786772712800606, + 0.04791603498564944, + 0.04796434284329282, + 0.048012650700936195, + 0.04806095855857957, + 0.04810926641622295, + 0.04815757427386633, + 0.048205882131509704, + 0.04825418998915308, + 0.04830249784679646, + 0.04835080570443984, + 0.04839911356208322, + 0.0484474214197266, + 0.048495729277369976, + 0.04854403713501335, + 0.04859234499265673, + 0.04864065285030011, + 0.048688960707943485, + 0.04873726856558686, + 0.04878557642323024, + 0.04883388428087362, + 0.048882192138516994, + 0.04893049999616037, + 0.04897880785380375, + 0.049027115711447126, + 0.049075423569090504, + 0.04912373142673388, + 0.049172039284377266, + 0.04922034714202064, + 0.04926865499966402, + 0.0493169628573074, + 0.049365270714950775, + 0.04941357857259415, + 0.04946188643023753, + 0.04951019428788091, + 0.049558502145524284, + 0.04960681000316766, + 0.04965511786081104, + 0.049703425718454416, + 0.049751733576097794, + 0.04980004143374117, + 0.04984834929138455, + 0.04989665714902793, + 0.04994496500667131, + 0.04999327286431469, + 0.050041580721958065, + 0.05008988857960144, + 0.05013819643724482, + 0.0501865042948882, + 0.050234812152531574, + 0.05028312001017495, + 0.05033142786781833, + 0.050379735725461706, + 0.050428043583105084, + 0.05047635144074846, + 0.05052465929839184, + 0.050572967156035216, + 0.05062127501367859, + 0.05066958287132197, + 0.050717890728965355, + 0.05076619858660873, + 0.05081450644425211, + 0.05086281430189549, + 0.050911122159538864, + 0.05095943001718224, + 0.05100773787482562, + 0.051056045732468996, + 0.051104353590112374, + 0.05115266144775575, + 0.05120096930539913, + 0.051249277163042506, + 0.05129758502068588, + 0.05134589287832926, + 0.05139420073597264, + 0.05144250859361602, + 0.0514908164512594, + 0.05153912430890278, + 0.051587432166546154, + 0.05163574002418953, + 0.05168404788183291, + 0.051732355739476286, + 0.051780663597119664, + 0.05182897145476304, + 0.05187727931240642, + 0.051925587170049796, + 0.05197389502769317, + 0.05202220288533655, + 0.05207051074297993, + 0.052118818600623305, + 0.05216712645826668, + 0.05221543431591006, + 0.052263742173553444, + 0.05231205003119682, + 0.0523603578888402, + 0.052408665746483576, + 0.052456973604126954, + 0.05250528146177033, + 0.05255358931941371, + 0.052601897177057086, + 0.05265020503470046, + 0.05269851289234384, + 0.05274682074998722, + 0.052795128607630595, + 0.05284343646527397, + 0.05289174432291735, + 0.05294005218056073, + 0.05298836003820411, + 0.05303666789584749, + 0.053084975753490866, + 0.053133283611134244, + 0.05318159146877762, + 0.053229899326421, + 0.053278207184064376, + 0.05332651504170775, + 0.05337482289935113, + 0.05342313075699451, + 0.053471438614637885, + 0.05351974647228126, + 0.05356805432992464, + 0.05361636218756802, + 0.053664670045211395, + 0.05371297790285477, + 0.05376128576049815, + 0.053809593618141534, + 0.05385790147578491, + 0.05390620933342829, + 0.053954517191071666, + 0.05400282504871504, + 0.05405113290635842, + 0.0540994407640018, + 0.054147748621645175, + 0.05419605647928855, + 0.05424436433693193, + 0.05429267219457531, + 0.054340980052218685, + 0.05438928790986206, + 0.05443759576750544, + 0.05448590362514882, + 0.0545342114827922, + 0.05458251934043558, + 0.054630827198078956, + 0.05467913505572233, + 0.05472744291336571, + 0.05477575077100909, + 0.054824058628652465, + 0.05487236648629584, + 0.05492067434393922, + 0.0549689822015826, + 0.055017290059225975, + 0.05506559791686935, + 0.05511390577451273, + 0.05516221363215611, + 0.055210521489799484, + 0.05525882934744286, + 0.05530713720508624, + 0.05535544506272962, + 0.055403752920373, + 0.05545206077801638, + 0.055500368635659755, + 0.05554867649330313, + 0.05559698435094651, + 0.05564529220858989, + 0.055693600066233265, + 0.05574190792387664, + 0.05579021578152002, + 0.0558385236391634, + 0.055886831496806774, + 0.05593513935445015, + 0.05598344721209353, + 0.056031755069736906, + 0.05608006292738029, + 0.05612837078502367, + 0.056176678642667045, + 0.05622498650031042, + 0.0562732943579538, + 0.05632160221559718, + 0.056369910073240555, + 0.05641821793088393, + 0.05646652578852731, + 0.05651483364617069, + 0.056563141503814064, + 0.05661144936145744, + 0.05665975721910082, + 0.056708065076744196, + 0.056756372934387574, + 0.05680468079203095, + 0.05685298864967433, + 0.05690129650731771, + 0.05694960436496109, + 0.05699791222260447, + 0.057046220080247845, + 0.05709452793789122, + 0.0571428357955346, + 0.05719114365317798, + 0.057239451510821354, + 0.05728775936846473, + 0.05733606722610811, + 0.057384375083751486, + 0.057432682941394864, + 0.05748099079903824, + 0.05752929865668162, + 0.057577606514324996, + 0.05762591437196838, + 0.05767422222961176, + 0.057722530087255135, + 0.05777083794489851, + 0.05781914580254189, + 0.05786745366018527, + 0.057915761517828644, + 0.05796406937547202, + 0.0580123772331154, + 0.058060685090758776, + 0.058108992948402154, + 0.05815730080604553 + ], + "y": [ + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012, + 1869.0950000000012 + ] + } + ], + "layout": { + "autosize": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "autorange": true, + "range": [ + 0.012143106385459741, + 0.060742731205234685 + ], + "title": { + "text": "Loss" + }, + "type": "linear" + }, + "yaxis": { + "autorange": true, + "range": [ + 103.53610754413774, + 4466.793892455864 + ], + "title": { + "text": "User CPU" + }, + "type": "linear" + } + } + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJMAAAFoCAYAAADjHrr5AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQd4FGX+x3+bSgq9Y8XGqZweKhbOeiqKgif8BQ8pcp4gdhEUlFNAjYogyKFY0NODWCgWBAuoCHqI5QTxUDwRFQQJLUhNSNv/806yS0ICmdndmf1N8pnnuSe32bft5/vOhvn4zjuBYDAYFA4IQAACEIAABCAAAQhAAAIQgAAEIAABCNggEEAm2aBEEQhAAAIQgAAEIAABCEAAAhCAAAQgAAGLADKJiQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCAAAQgAAEIQAACEIAABCAAAQggk5gDEIAABCAAAQhAAAIQgAAEIAABCEAAArYJIJNso6IgBCAAAQhAAAIQgAAEIAABCEAAAhCAADKJOQABCEAAAhCAAAQgAAEIQAACEIAABCBgmwAyyTYqCkIAAhCA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", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "x_col = 'generated.loss'\n", "y_col = 'telemetry_diff.cpu.times_avg.user'\n", - "color_col = 'generated.responsible_ai_metrics.params'\n", - "analytics.scatter2d_with_colors(df,\n", + "color_col = 'generated.responsible_ai_metadata.params'\n", + "flow_plot.scatter2d_with_colors(df,\n", " x_col='generated.loss',\n", " y_col='telemetry_diff.cpu.times_avg.user',\n", - " color_col='generated.responsible_ai_metrics.params',\n", + " color_col='generated.responsible_ai_metadata.params',\n", " x_label='Loss',\n", " y_label='User CPU', \n", " color_label='#Params',\n", @@ -458,17 +8249,96 @@ " yaxis_title='User CPU',\n", " plot_horizon_line=True,\n", " horizon_quantile=0.5,\n", - " plot_pareto=True)" + " plot_pareto=False)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "cf639f68-00e7-4f1f-924e-e22f08c61dd9", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
task_idgenerated.losstelemetry_diff.cpu.times_avg.usergenerated.responsible_ai_metadata.params
00fb0fc93-f421-48db-99ea-6fc2f237646b0.014729397.45162990.0
1f776846b-fa09-49b9-989c-815104bdcd240.040326411.42359840.0
2a83fa864-e381-4e52-aca0-90a8a5b54d5d0.0581571179.7642184840.0
334b765a2-80e4-4324-92b8-3c7a4d2cf5e90.0182421862.611890690.0
\n", + "
" + ], + "text/plain": [ + " task_id generated.loss \\\n", + "0 0fb0fc93-f421-48db-99ea-6fc2f237646b 0.014729 \n", + "1 f776846b-fa09-49b9-989c-815104bdcd24 0.040326 \n", + "2 a83fa864-e381-4e52-aca0-90a8a5b54d5d 0.058157 \n", + "3 34b765a2-80e4-4324-92b8-3c7a4d2cf5e9 0.018242 \n", + "\n", + " telemetry_diff.cpu.times_avg.user generated.responsible_ai_metadata.params \n", + "0 397.45 162990.0 \n", + "1 411.42 359840.0 \n", + "2 1179.76 42184840.0 \n", + "3 1862.61 1890690.0 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "clauses = [\n", " (y_col, \"<=\", 0.5),\n", @@ -499,12 +8369,134 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "6ff83981-3a4c-4d26-a3ca-5a9c3649917c", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
task_idsubmitted_atactivity_idworkflow_idutc_timestampadapter_idusercampaign_idsys_namenode_name...telemetry_diff.network.netio_per_interface.bridge100.bytes_senttelemetry_diff.network.netio_per_interface.bridge100.bytes_recvtelemetry_diff.network.netio_per_interface.bridge100.packets_senttelemetry_diff.network.netio_per_interface.bridge100.packets_recvtelemetry_diff.network.netio_per_interface.bridge100.errintelemetry_diff.network.netio_per_interface.bridge100.errouttelemetry_diff.network.netio_per_interface.bridge100.dropintelemetry_diff.network.netio_per_interface.bridge100.dropoutstatuselapsed_time
00fb0fc93-f421-48db-99ea-6fc2f237646b2024-02-09 01:05:28.202881024wrapper775f6300-3855-48a3-9cef-123ad182afd12024-02-09 01:06:27.422988032daskrootsuper_campaignDarwinMAC132633...0.00.02.00.00.00.00.00.0FINISHED59.133646
\n", + "

1 rows × 334 columns

\n", + "
" + ], + "text/plain": [ + " task_id submitted_at \\\n", + "0 0fb0fc93-f421-48db-99ea-6fc2f237646b 2024-02-09 01:05:28.202881024 \n", + "\n", + " activity_id workflow_id \\\n", + "0 wrapper 775f6300-3855-48a3-9cef-123ad182afd1 \n", + "\n", + " utc_timestamp adapter_id user campaign_id sys_name \\\n", + "0 2024-02-09 01:06:27.422988032 dask root super_campaign Darwin \n", + "\n", + " node_name ... \\\n", + "0 MAC132633 ... \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_sent \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.bytes_recv \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_sent \\\n", + "0 2.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.packets_recv \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.errin \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.errout \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.dropin \\\n", + "0 0.0 \n", + "\n", + " telemetry_diff.network.netio_per_interface.bridge100.dropout status \\\n", + "0 0.0 FINISHED \n", + "\n", + " elapsed_time \n", + "0 59.133646 \n", + "\n", + "[1 rows x 334 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df.query(f\"task_id == '{df.head(1)['task_id'].values[0]}'\") " ] @@ -519,7 +8511,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "b2ea6476-2eb3-4990-bf85-4858901c4422", "metadata": { "tags": [] @@ -531,15 +8523,50 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, + "id": "62597c13-f075-45e2-a0bb-9f224bdfa20e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "odict_items([])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result.items()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "id": "130eb28b-6c37-437e-8397-3f3471bc93ac", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[28], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m task_id, res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43miter\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mresult\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m res\n", + "\u001b[0;31mStopIteration\u001b[0m: " + ] + } + ], "source": [ - "task_id, res = next(iter(result.items()))\n", - "res" + "# task_id, res = next(iter(result.items()))\n", + "# res" ] }, { @@ -583,16 +8610,6 @@ "result_df = tasks_with_outliers.loc[:, tasks_with_outliers.columns.isin(selected_columns)]\n", "result_df" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46af1097-502e-44d8-8b6f-8e63931f7cca", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -611,7 +8628,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/requirements.txt b/requirements.txt index 63655c23..69fdd2c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -PyYAML==6.0.1 redis==4.4.2 psutil==5.9.5 py-cpuinfo==9.0.0 @@ -8,3 +7,4 @@ flask==2.2.2 requests==2.31.0 flask_restful==0.3.9 pandas==2.0.3 +omegaconf diff --git a/resources/sample_settings.yaml b/resources/sample_settings.yaml index 3ebcdadc..e5bcc5b3 100644 --- a/resources/sample_settings.yaml +++ b/resources/sample_settings.yaml @@ -5,8 +5,10 @@ project: performance_logging: false register_workflow: true enrich_messages: true + db_flush_mode: online # or offline + telemetry_capture: - gpu: false + gpu: ~ # ~ means None. This is a list that should specify which metrics of the GPU that should be monitored cpu: true per_cpu: true process_info: true @@ -14,7 +16,12 @@ project: disk: true network: true machine_info: true - + +instrumentation: + torch: + mode: telemetry_and_tensor_inspection # tensor_inspection, telemetry, telemetry_and_tensor_inspection, full, ~ + save_models: True + log: log_path: "default" log_file_level: error @@ -22,14 +29,16 @@ log: experiment: user: root - experiment_id: flowcept_experiment + campaign_id: super_campaign main_redis: host: localhost + instances: ["localhost:6379"] # We can have multiple redis instances being accessed by the consumers but each interceptor will currently access one single redis. port: 6379 channel: interception buffer_size: 50 insertion_buffer_time_secs: 5 + chunk_size: 10 # use can use 0 or -1 to disable this. Or simply omit this from the config file. mongodb: host: localhost @@ -47,13 +56,7 @@ web_server: port: 5000 sys_metadata: - place_holder: "" -# sys_name: 0 -# node_name: 0 -# login_name: 0 -# public_ip: 0 -# private_ip: 0 -# + environment_id: "frontier" extra_metadata: place_holder: "" diff --git a/setup.py b/setup.py index 35cbb436..2d251f0f 100644 --- a/setup.py +++ b/setup.py @@ -134,5 +134,5 @@ def create_settings_file(): "Topic :: System :: Monitoring", "Topic :: Database", ], - python_requires=">=3.8", + python_requires=">=3.9", ) diff --git a/tests/adapters/dask_test_utils.py b/tests/adapters/dask_test_utils.py index c4784052..93dd2681 100644 --- a/tests/adapters/dask_test_utils.py +++ b/tests/adapters/dask_test_utils.py @@ -22,20 +22,20 @@ def close_dask(client, cluster): assert client.status == "closed" -def setup_local_dask_cluster(consumer=None, n_workers=1): +def setup_local_dask_cluster(consumer=None, n_workers=1, exec_bundle=None): from flowcept import ( FlowceptDaskSchedulerAdapter, FlowceptDaskWorkerAdapter, ) if consumer is None or not consumer.is_started: - consumer = FlowceptConsumerAPI().start() + consumer = FlowceptConsumerAPI(bundle_exec_id=exec_bundle).start() cluster = LocalCluster(n_workers=n_workers) scheduler = cluster.scheduler client = Client(scheduler.address) scheduler.add_plugin(FlowceptDaskSchedulerAdapter(scheduler)) - client.register_worker_plugin(FlowceptDaskWorkerAdapter()) + client.register_plugin(FlowceptDaskWorkerAdapter()) return client, cluster, consumer diff --git a/tests/adapters/test_dask.py b/tests/adapters/test_dask.py index c90315b4..ddc04bc4 100644 --- a/tests/adapters/test_dask.py +++ b/tests/adapters/test_dask.py @@ -1,35 +1,46 @@ import unittest +import uuid from time import sleep -from uuid import uuid4 import numpy as np from dask.distributed import Client, LocalCluster -from flowcept import FlowceptConsumerAPI, TaskQueryAPI +from flowcept import FlowceptConsumerAPI, TaskQueryAPI, DBAPI from flowcept.commons.flowcept_logger import FlowceptLogger -from flowcept.commons.utils import assert_by_querying_tasks_until +from flowcept.commons.utils import ( + assert_by_querying_tasks_until, + evaluate_until, +) +from flowcept.flowceptor.adapters.dask.dask_plugins import ( + register_dask_workflow, +) from tests.adapters.dask_test_utils import ( setup_local_dask_cluster, close_dask, ) -def dummy_func1(x, workflow_id=None): +def problem_evaluate(phenome, uuid): + print(phenome, uuid) + return 1.0 + + +def dummy_func1(x): cool_var = "cool value" # test if we can intercept this var print(cool_var) y = cool_var return x * 2 -def dummy_func2(y, workflow_id=None): +def dummy_func2(y): return y + y -def dummy_func3(z, w, workflow_id=None): +def dummy_func3(z, w): return {"r": z + w} -def dummy_func4(x_obj, workflow_id=None): +def dummy_func4(x_obj): return {"z": x_obj["x"] * 2} @@ -45,6 +56,7 @@ class TestDask(unittest.TestCase): def __init__(self, *args, **kwargs): super(TestDask, self).__init__(*args, **kwargs) self.query_api = TaskQueryAPI() + self.db_api = DBAPI() self.logger = FlowceptLogger() @classmethod @@ -56,31 +68,28 @@ def setUpClass(cls): ) = setup_local_dask_cluster(TestDask.consumer, 2) def atest_pure_workflow(self): + wf_id = register_dask_workflow(self.client) i1 = np.random.random() - wf_id = f"wf_{uuid4()}" - o1 = self.client.submit(dummy_func1, i1, workflow_id=wf_id) - o2 = TestDask.client.submit(dummy_func2, o1, workflow_id=wf_id) + o1 = self.client.submit(dummy_func1, i1) + o2 = TestDask.client.submit(dummy_func2, o1) self.logger.debug(o2.result()) self.logger.debug(o2.key) - sleep(3) - return o2.key + return wf_id, o2.key def test_dummyfunc(self): + register_dask_workflow(self.client) i1 = np.random.random() - wf_id = f"wf_{uuid4()}" - o1 = self.client.submit(dummy_func1, i1, workflow_id=wf_id) + o1 = self.client.submit(dummy_func1, i1) # self.logger.debug(o1.result()) - sleep(3) return o1.key def test_long_workflow(self): i1 = np.random.random() - wf_id = f"wf_{uuid4()}" - o1 = TestDask.client.submit(dummy_func1, i1, workflow_id=wf_id) - o2 = TestDask.client.submit(dummy_func2, o1, workflow_id=wf_id) - o3 = TestDask.client.submit(dummy_func3, o1, o2, workflow_id=wf_id) + register_dask_workflow(self.client) + o1 = TestDask.client.submit(dummy_func1, i1) + o2 = TestDask.client.submit(dummy_func2, o1) + o3 = TestDask.client.submit(dummy_func3, o1, o2) self.logger.debug(o3.result()) - sleep(3) return o3.key def varying_args(self): @@ -90,13 +99,12 @@ def varying_args(self): assert result["r"] > 0 self.logger.debug(result) self.logger.debug(o1.key) - sleep(3) return o1.key def test_map_workflow(self): i1 = np.random.random(3) - wf_id = f"wf_{uuid4()}" - o1 = TestDask.client.map(dummy_func1, i1, workflow_id=wf_id) + register_dask_workflow(self.client) + o1 = TestDask.client.map(dummy_func1, i1) for o in o1: result = o.result() assert result > 0 @@ -104,6 +112,34 @@ def test_map_workflow(self): sleep(3) return o1 + def test_evaluate_submit(self): + wf_id = register_dask_workflow(self.client) + print(wf_id) + phenome = { + "optimizer": "Adam", + "lr": 0.0001, + "betas": [0.8, 0.999], + "eps": 1e-08, + "weight_decay": 0.05, + "ams_grad": 0.5, + "batch_normalization": True, + "dropout": True, + "upsampling": "bilinear", + "dilation": True, + "num_filters": 1, + } + + o1 = TestDask.client.submit( + problem_evaluate, phenome, str(uuid.uuid4()) + ) + print(o1.result()) + assert assert_by_querying_tasks_until( + {"workflow_id": wf_id}, + condition_to_evaluate=lambda docs: "phenome" in docs[0]["used"] + and len(docs[0]["generated"]) > 0, + ) + return o1 + def test_map_workflow_kwargs(self): i1 = [ {"x": np.random.random(), "y": np.random.random()}, @@ -111,13 +147,12 @@ def test_map_workflow_kwargs(self): {"x": 4, "batch_norm": False}, {"x": 6, "batch_norm": True, "empty_string": ""}, ] - wf_id = f"wf_{uuid4()}" - o1 = TestDask.client.map(dummy_func4, i1, workflow_id=wf_id) + register_dask_workflow(self.client) + o1 = TestDask.client.map(dummy_func4, i1) for o in o1: result = o.result() assert result["z"] > 0 self.logger.debug(o.key, result) - sleep(3) return o1 def error_task_submission(self): @@ -130,14 +165,21 @@ def error_task_submission(self): return o1.key def test_observer_and_consumption(self): - o2_task_id = self.atest_pure_workflow() + wf_id, o2_task_id = self.atest_pure_workflow() print("Task_id=" + o2_task_id) + print("wf_id=" + wf_id) print("Done workflow!") assert assert_by_querying_tasks_until( {"task_id": o2_task_id}, - condition_to_evaluate=lambda docs: "telemetry_at_end" in docs[0], + condition_to_evaluate=lambda docs: "telemetry_at_end" in docs[0] + and "y" in docs[0]["used"] + and len(docs[0]["generated"]) > 0, ) - print("Query condition met!") + assert evaluate_until( + lambda: self.db_api.get_workflow(workflow_id=wf_id) is not None, + msg="Checking if workflow object was saved in db", + ) + print("All conditions met!") def test_observer_and_consumption_varying_args(self): o2_task_id = self.varying_args() @@ -160,6 +202,5 @@ def tearDownClass(cls): except Exception as e: print(e) pass - if TestDask.consumer: TestDask.consumer.stop() diff --git a/tests/adapters/test_dask_with_context_mgmt.py b/tests/adapters/test_dask_with_context_mgmt.py index 1d6c9d62..364c543c 100644 --- a/tests/adapters/test_dask_with_context_mgmt.py +++ b/tests/adapters/test_dask_with_context_mgmt.py @@ -1,19 +1,21 @@ import unittest -from uuid import uuid4 import numpy as np from dask.distributed import Client -from flowcept import FlowceptConsumerAPI, TaskQueryAPI +from flowcept import FlowceptConsumerAPI from flowcept.commons.flowcept_logger import FlowceptLogger from flowcept.commons.utils import assert_by_querying_tasks_until +from flowcept.flowceptor.adapters.dask.dask_plugins import ( + register_dask_workflow, +) from tests.adapters.dask_test_utils import ( setup_local_dask_cluster, close_dask, ) -def dummy_func1(x, workflow_id=None): +def dummy_func1(x): cool_var = "cool value" # test if we can intercept this var print(cool_var) y = cool_var @@ -39,9 +41,9 @@ def setUpClass(cls): def test_workflow(self): i1 = np.random.random() - wf_id = f"wf_{uuid4()}" + register_dask_workflow(self.client) with FlowceptConsumerAPI(): - o1 = self.client.submit(dummy_func1, i1, workflow_id=wf_id) + o1 = self.client.submit(dummy_func1, i1) self.logger.debug(o1.result()) self.logger.debug(o1.key) diff --git a/tests/api/dbapi_test.py b/tests/api/dbapi_test.py index e026d117..588e93ff 100644 --- a/tests/api/dbapi_test.py +++ b/tests/api/dbapi_test.py @@ -2,7 +2,6 @@ from uuid import uuid4 from flowcept.commons.flowcept_dataclasses.task_object import TaskObject -from flowcept.commons.flowcept_dataclasses.telemetry import Telemetry from flowcept.commons.flowcept_dataclasses.workflow_object import ( WorkflowObject, ) @@ -10,6 +9,15 @@ from flowcept.flowceptor.telemetry_capture import TelemetryCapture +class OurObject: + def __init__(self): + self.a = 1 + self.b = 2 + + def __str__(self): + return f"It worked! {self.a} {self.b}" + + class WorkflowDBTest(unittest.TestCase): def test_wf_dao(self): dbapi = DBAPI() @@ -29,7 +37,8 @@ def test_wf_dao(self): wf2_id = str(uuid4()) print(wf2_id) - wf2 = WorkflowObject(workflow_id=wf2_id) + wf2 = WorkflowObject() + wf2.workflow_id = wf2_id tel = TelemetryCapture() assert dbapi.insert_or_update_workflow(wf2) @@ -48,6 +57,19 @@ def test_wf_dao(self): wf_obj = dbapi.get_workflow(wf2_id) assert len(wf_obj.machine_info) == 2 + def test_save_blob(self): + dbapi = DBAPI() + import pickle + + obj = pickle.dumps(OurObject()) + + obj_id = dbapi.save_object(object=obj) + print(obj_id) + + obj_docs = dbapi.query(filter={"object_id": obj_id}, type="object") + loaded_obj = pickle.loads(obj_docs[0]["data"]) + assert type(loaded_obj) == OurObject + def test_dump(self): dbapi = DBAPI() wf_id = str(uuid4()) diff --git a/tests/api/flowcept_api_test.py b/tests/api/flowcept_api_test.py new file mode 100644 index 00000000..c8d9b375 --- /dev/null +++ b/tests/api/flowcept_api_test.py @@ -0,0 +1,49 @@ +import unittest +from time import sleep +from uuid import uuid4 + +from flowcept import FlowceptConsumerAPI +from flowcept.commons.flowcept_dataclasses.workflow_object import ( + WorkflowObject, +) +from flowcept.commons.utils import assert_by_querying_tasks_until +from flowcept.flowcept_api.db_api import DBAPI +from flowcept.instrumentation.decorators.flowcept_task import flowcept_task + + +@flowcept_task +def sum_one(n, workflow_id=None): + sleep(0.1) + return n + 1 + + +@flowcept_task +def mult_two(n, workflow_id=None): + return n * 2 + + +class FlowceptAPITest(unittest.TestCase): + def test_simple_workflow(self): + db = DBAPI() + assert FlowceptConsumerAPI.services_alive() + + wf_id = str(uuid4()) + with FlowceptConsumerAPI(FlowceptConsumerAPI.INSTRUMENTATION): + # The next line is optional + db.insert_or_update_workflow(WorkflowObject(workflow_id=wf_id)) + n = 3 + o1 = sum_one(n, workflow_id=wf_id) + o2 = mult_two(o1, workflow_id=wf_id) + print(o2) + + assert assert_by_querying_tasks_until( + {"workflow_id": wf_id}, + condition_to_evaluate=lambda docs: len(docs) == 2, + ) + + print("workflow_id", wf_id) + + assert len(db.query(filter={"workflow_id": wf_id})) == 2 + assert ( + len(db.query(type="workflow", filter={"workflow_id": wf_id})) == 1 + ) diff --git a/tests/api/query_test.py b/tests/api/query_test.py index e863fff6..09d80de3 100644 --- a/tests/api/query_test.py +++ b/tests/api/query_test.py @@ -61,7 +61,7 @@ def gen_mock_multi_workflow_data(size=1): t1.started_at = int(_start.timestamp()) t1.ended_at = int(_end.timestamp()) t1.campaign_id = "mock_campaign" - t1.status = Status.FINISHED.name + t1.status = Status.FINISHED t1.user = "user_test" new_docs.append(t1.to_dict()) new_task_ids.append(t1.task_id) @@ -83,7 +83,7 @@ def gen_mock_multi_workflow_data(size=1): t2.started_at = int(_start.timestamp()) t2.ended_at = int(_end.timestamp()) - t2.status = Status.FINISHED.name + t2.status = Status.FINISHED t2.campaign_id = t1.campaign_id t2.user = t1.campaign_id new_docs.append(t2.to_dict()) @@ -363,7 +363,7 @@ def test_query_df_top_k_quantiles_sorted(self): sort = [ ("telemetry_diff.process.cpu_times.user", TaskQueryAPI.ASC), ("generated.loss", TaskQueryAPI.ASC), - ("generated.responsible_ai_metrics.flops", TaskQueryAPI.ASC), + ("generated.responsible_ai_metadata.flops", TaskQueryAPI.ASC), ] df = self.api.df_get_tasks_quantiles( clauses=clauses, diff --git a/tests/api/sample_data_with_telemetry_and_rai.json b/tests/api/sample_data_with_telemetry_and_rai.json index 2f70ec78..5760a126 100644 --- a/tests/api/sample_data_with_telemetry_and_rai.json +++ b/tests/api/sample_data_with_telemetry_and_rai.json @@ -1 +1 @@ -[{"_id": {"$oid": "65c5340c8742cbf9f72b8b76"}, "task_id": "wrapper-485dd60db4213e5872437b332bd60646", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.202881, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440787.422988, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:06:28.267Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.74, "nice": 0.0, "system": 31287.57, "idle": 275323.65}, "percent_all": 32.1, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.8, "nice": 0.0, "system": 789.5, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.57}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [90.0, 90.8, 42.6, 48.5, 22.2, 17.4, 17.5, 6.3, 1.4, 0.6]}, "process": {"pid": 65783, "memory": {"rss": 661061632, "vms": 420960452608, "pfaults": 54581, "pageins": 39}, "memory_percent": 3.8478851318359375, "cpu_times": {"user": 4.154982912, "system": 0.53017664, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035182592, "percent": 76.5, "used": 6553665536, "free": 43483136, "active": 4002627584, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2845347, "ended_at": 1707422787.4181814, "telemetry_at_end": {"cpu": {"times_avg": {"user": 69331.19, "nice": 0.0, "system": 31442.88, "idle": 275340.35}, "percent_all": 97.1, "times_per_cpu": [{"user": 20321.25, "nice": 0.0, "system": 10220.4, "idle": 4860.67}, {"user": 20654.02, "nice": 0.0, "system": 10542.05, "idle": 4718.38}, {"user": 7270.46, "nice": 0.0, "system": 3959.04, "idle": 26496.36}, {"user": 5137.06, "nice": 0.0, "system": 2163.8, "idle": 30653.95}, {"user": 3554.7, "nice": 0.0, "system": 1161.07, "idle": 33382.5}, {"user": 2799.19, "nice": 0.0, "system": 804.99, "idle": 34538.89}, {"user": 4324.65, "nice": 0.0, "system": 1435.86, "idle": 32386.28}, {"user": 2274.43, "nice": 0.0, "system": 557.38, "idle": 35394.7}, {"user": 1602.2, "nice": 0.0, "system": 330.17, "idle": 36316.01}, {"user": 1393.23, "nice": 0.0, "system": 268.12, "idle": 36592.61}], "percent_per_cpu": [98.8, 98.8, 98.0, 97.7, 97.1, 96.6, 97.3, 96.5, 95.8, 95.3]}, "process": {"pid": 65783, "memory": {"rss": 3381313536, "vms": 425213526016, "pfaults": 7183545, "pageins": 78}, "memory_percent": 19.681835174560547, "cpu_times": {"user": 318.797152256, "system": 60.949655552, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 2007025, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3256057856, "percent": 81.0, "used": 5652824064, "free": 162594816, "active": 3034939392, "inactive": 3080241152, "wired": 2617884672}, "swap": {"total": 3221225472, "used": 2039283712, "free": 1181941760, "percent": 63.3, "sin": 72424914944, "sout": 2752135168}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174777856, "percent": 1.3}, "io_sum": {"read_count": 5549128, "write_count": 2463475, "read_bytes": 97503764480, "write_bytes": 37131018240, "read_time": 1512266, "write_time": 188503}}, "network": {"netio_sum": {"bytes_sent": 1846870016, "bytes_recv": 742617088, "packets_sent": 2557570, "packets_recv": 1312601, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83288064, "bytes_recv": 83288064, "packets_sent": 173708, "packets_recv": 173708, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167385600, "bytes_recv": 2987008, "packets_sent": 1657528, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591150080, "bytes_recv": 656338944, "packets_sent": 708098, "packets_recv": 1136550, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5292, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10584, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.014728536784648895, "accuracy": 40.75, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 21880192, "params": 162990, "max_width": 100, "depth": 12, "n_fc_layers": 5, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b77"}, "task_id": "wrapper-493b030fcaf36a06a9305f23af63d469", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.206701, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440789.350381, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:06:33.280Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 50.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.5, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661127168, "vms": 420960452608, "pfaults": 54587, "pageins": 39}, "memory_percent": 3.8482666015625, "cpu_times": {"user": 4.15573376, "system": 0.530893408, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2848635, "ended_at": 1707422789.3468654, "telemetry_at_end": {"cpu": {"times_avg": {"user": 69345.17, "nice": 0.0, "system": 31446.98, "idle": 275340.83}, "percent_all": 97.4, "times_per_cpu": [{"user": 20322.29, "nice": 0.0, "system": 10220.95, "idle": 4860.69}, {"user": 20655.1, "nice": 0.0, "system": 10542.67, "idle": 4718.4}, {"user": 7271.93, "nice": 0.0, "system": 3959.42, "idle": 26496.4}, {"user": 5138.52, "nice": 0.0, "system": 2164.2, "idle": 30653.99}, {"user": 3556.15, "nice": 0.0, "system": 1161.48, "idle": 33382.55}, {"user": 2800.68, "nice": 0.0, "system": 805.35, "idle": 34538.95}, {"user": 4326.13, "nice": 0.0, "system": 1436.22, "idle": 32386.33}, {"user": 2275.92, "nice": 0.0, "system": 557.73, "idle": 35394.76}, {"user": 1603.69, "nice": 0.0, "system": 330.53, "idle": 36316.07}, {"user": 1394.76, "nice": 0.0, "system": 268.43, "idle": 36592.69}], "percent_per_cpu": [98.8, 98.8, 97.9, 97.9, 97.4, 96.9, 97.4, 96.8, 96.9, 95.8]}, "process": {"pid": 65783, "memory": {"rss": 3336765440, "vms": 425309650944, "pfaults": 7344341, "pageins": 78}, "memory_percent": 19.422531127929688, "cpu_times": {"user": 330.297311232, "system": 62.648221696, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 2053429, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3104882688, "percent": 81.9, "used": 5665767424, "free": 56360960, "active": 3065348096, "inactive": 3033595904, "wired": 2600419328}, "swap": {"total": 3221225472, "used": 2039283712, "free": 1181941760, "percent": 63.3, "sin": 72426586112, "sout": 2752135168}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174609920, "percent": 1.3}, "io_sum": {"read_count": 5549381, "write_count": 2463773, "read_bytes": 97506377728, "write_bytes": 37134004224, "read_time": 1512322, "write_time": 188518}}, "network": {"netio_sum": {"bytes_sent": 1846901760, "bytes_recv": 742648832, "packets_sent": 2557664, "packets_recv": 1312697, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83316736, "bytes_recv": 83316736, "packets_sent": 173778, "packets_recv": 173778, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167387648, "bytes_recv": 2987008, "packets_sent": 1657540, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591151104, "bytes_recv": 656342016, "packets_sent": 708110, "packets_recv": 1136576, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5292, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10584, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.040325844478607174, "accuracy": 11.35, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 47275136, "params": 359840, "max_width": 400, "depth": 16, "n_fc_layers": 9, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b78"}, "task_id": "wrapper-e944d8660800c2d4f1fa1ccd2f2cad53", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.210366, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440897.270892, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:08:18.388Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.51, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661143552, "vms": 420960452608, "pfaults": 54590, "pageins": 39}, "memory_percent": 3.8483619689941406, "cpu_times": {"user": 4.156226048, "system": 0.53132896, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2850378, "ended_at": 1707422897.2668266, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70113.51, "nice": 0.0, "system": 31689.0, "idle": 275374.34}, "percent_all": 96.8, "times_per_cpu": [{"user": 20383.98, "nice": 0.0, "system": 10253.28, "idle": 4862.54}, {"user": 20717.96, "nice": 0.0, "system": 10576.36, "idle": 4720.29}, {"user": 7351.72, "nice": 0.0, "system": 3982.15, "idle": 26498.8}, {"user": 5218.72, "nice": 0.0, "system": 2187.17, "idle": 30656.69}, {"user": 3635.61, "nice": 0.0, "system": 1184.78, "idle": 33385.72}, {"user": 2879.99, "nice": 0.0, "system": 828.64, "idle": 34542.48}, {"user": 4407.94, "nice": 0.0, "system": 1457.68, "idle": 32389.64}, {"user": 2357.31, "nice": 0.0, "system": 578.94, "idle": 35398.87}, {"user": 1684.99, "nice": 0.0, "system": 351.12, "idle": 36320.89}, {"user": 1475.29, "nice": 0.0, "system": 288.88, "idle": 36598.42}], "percent_per_cpu": [98.1, 98.1, 97.7, 97.4, 97.0, 96.7, 96.9, 96.1, 95.5, 94.6]}, "process": {"pid": 65783, "memory": {"rss": 2892447744, "vms": 424287944704, "pfaults": 17131115, "pageins": 78}, "memory_percent": 16.836261749267578, "cpu_times": {"user": 946.686656512, "system": 154.097467392, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 4541085, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3876110336, "percent": 77.4, "used": 5258297344, "free": 794689536, "active": 2775171072, "inactive": 3078914048, "wired": 2483126272}, "swap": {"total": 3221225472, "used": 2022506496, "free": 1198718976, "percent": 62.8, "sin": 72791949312, "sout": 2760916992}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745176145920, "percent": 1.3}, "io_sum": {"read_count": 5580885, "write_count": 2467115, "read_bytes": 97946849280, "write_bytes": 37170196480, "read_time": 1516773, "write_time": 188881}}, "network": {"netio_sum": {"bytes_sent": 1848044544, "bytes_recv": 743379968, "packets_sent": 2561282, "packets_recv": 1315877, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83763200, "bytes_recv": 83763200, "packets_sent": 175804, "packets_recv": 175804, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167768576, "bytes_recv": 2987008, "packets_sent": 1658349, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591464448, "bytes_recv": 656626688, "packets_sent": 708879, "packets_recv": 1137730, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5296, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2933760, "bytes_recv": 2048, "packets_sent": 10592, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.05815730080604553, "accuracy": 11.35, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 5405073024, "params": 42184840, "max_width": 4000, "depth": 24, "n_fc_layers": 17, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=500, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=500, out_features=1000, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=1000, out_features=1500, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=1500, out_features=2000, bias=True)\n (8): Softmax(dim=1)\n (9): Linear(in_features=2000, out_features=2500, bias=True)\n (10): Softmax(dim=1)\n (11): Linear(in_features=2500, out_features=3000, bias=True)\n (12): Softmax(dim=1)\n (13): Linear(in_features=3000, out_features=3500, bias=True)\n (14): Softmax(dim=1)\n (15): Linear(in_features=3500, out_features=4000, bias=True)\n (16): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b79"}, "task_id": "wrapper-e0b4c651a646dfa7893e53b2241ff836", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.213765, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440992.752261, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:09:53.463Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.51, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.77}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661159936, "vms": 420960452608, "pfaults": 54593, "pageins": 39}, "memory_percent": 3.8484573364257812, "cpu_times": {"user": 4.156712448, "system": 0.531758656, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9271, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2852035, "ended_at": 1707422992.7469294, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70796.36, "nice": 0.0, "system": 31867.17, "idle": 275437.88}, "percent_all": 93.1, "times_per_cpu": [{"user": 20439.66, "nice": 0.0, "system": 10279.64, "idle": 4865.53}, {"user": 20774.45, "nice": 0.0, "system": 10603.53, "idle": 4723.28}, {"user": 7422.93, "nice": 0.0, "system": 3998.9, "idle": 26503.82}, {"user": 5289.94, "nice": 0.0, "system": 2203.8, "idle": 30662.74}, {"user": 3706.11, "nice": 0.0, "system": 1201.52, "idle": 33392.47}, {"user": 2949.95, "nice": 0.0, "system": 844.72, "idle": 34550.54}, {"user": 4481.16, "nice": 0.0, "system": 1472.97, "idle": 32395.56}, {"user": 2430.16, "nice": 0.0, "system": 593.75, "idle": 35405.72}, {"user": 1756.79, "nice": 0.0, "system": 365.5, "idle": 36329.21}, {"user": 1545.21, "nice": 0.0, "system": 302.84, "idle": 36609.01}], "percent_per_cpu": [96.5, 96.5, 94.6, 93.6, 92.8, 91.4, 93.7, 92.8, 91.2, 88.8]}, "process": {"pid": 65783, "memory": {"rss": 2850635776, "vms": 424779087872, "pfaults": 23593031, "pageins": 78}, "memory_percent": 16.592884063720703, "cpu_times": {"user": 1490.718031872, "system": 217.113657344, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 6293997, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3341893632, "percent": 80.5, "used": 5749145600, "free": 98893824, "active": 3247390720, "inactive": 3235725312, "wired": 2501754880}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72856813568, "sout": 2768257024}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745172246528, "percent": 1.3}, "io_sum": {"read_count": 5587993, "write_count": 2470679, "read_bytes": 98035175424, "write_bytes": 37206433792, "read_time": 1518483, "write_time": 189195}}, "network": {"netio_sum": {"bytes_sent": 1849780224, "bytes_recv": 744077312, "packets_sent": 2565007, "packets_recv": 1318796, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84154368, "bytes_recv": 84154368, "packets_sent": 177605, "packets_recv": 177605, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1168813056, "bytes_recv": 2987008, "packets_sent": 1659550, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591762432, "bytes_recv": 656932864, "packets_sent": 709585, "packets_recv": 1138848, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5301, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2934784, "bytes_recv": 2048, "packets_sent": 10602, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.018241909003257752, "accuracy": 10.28, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 324195712, "params": 1890690, "max_width": 100, "depth": 16, "n_fc_layers": 5, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7a"}, "task_id": "wrapper-74824901e409ecc16236f3e847d16d2d", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.218762, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440994.537758, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:09:58.471Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.6}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [83.3, 85.7, 42.9, 66.7, 28.6, 14.3, 0.0, 14.3, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669302784, "vms": 421042208768, "pfaults": 55258, "pageins": 41}, "memory_percent": 3.895854949951172, "cpu_times": {"user": 4.203065088, "system": 0.543155456, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 10, "num_ctx_switches": {"voluntary": 9509, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532161, "write_count": 2451938, "read_bytes": 97099530240, "write_bytes": 36508528640, "read_time": 1508184, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2941866, "ended_at": 1707422994.5367415, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70809.33, "nice": 0.0, "system": 31870.03, "idle": 275439.53}, "percent_all": 90.6, "times_per_cpu": [{"user": 20440.87, "nice": 0.0, "system": 10280.08, "idle": 4865.53}, {"user": 20775.66, "nice": 0.0, "system": 10604.0, "idle": 4723.28}, {"user": 7424.28, "nice": 0.0, "system": 3999.14, "idle": 26503.99}, {"user": 5291.3, "nice": 0.0, "system": 2204.07, "idle": 30662.87}, {"user": 3707.4, "nice": 0.0, "system": 1201.79, "idle": 33392.67}, {"user": 2951.25, "nice": 0.0, "system": 844.98, "idle": 34550.75}, {"user": 4482.54, "nice": 0.0, "system": 1473.23, "idle": 32395.69}, {"user": 2431.47, "nice": 0.0, "system": 593.99, "idle": 35405.95}, {"user": 1758.06, "nice": 0.0, "system": 365.71, "idle": 36329.51}, {"user": 1546.5, "nice": 0.0, "system": 303.04, "idle": 36609.29}], "percent_per_cpu": [100.0, 100.0, 90.3, 92.6, 88.6, 88.1, 92.7, 87.1, 83.1, 84.2]}, "process": {"pid": 65783, "memory": {"rss": 2825043968, "vms": 424423047168, "pfaults": 23660249, "pageins": 78}, "memory_percent": 16.443920135498047, "cpu_times": {"user": 1500.83928064, "system": 218.118602752, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 6320493, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3546005504, "percent": 79.4, "used": 5691146240, "free": 353452032, "active": 3214098432, "inactive": 3183362048, "wired": 2477047808}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72872804352, "sout": 2768879616}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745171800064, "percent": 1.3}, "io_sum": {"read_count": 5588541, "write_count": 2470698, "read_bytes": 98052403200, "write_bytes": 37207339008, "read_time": 1518600, "write_time": 189196}}, "network": {"netio_sum": {"bytes_sent": 1849812992, "bytes_recv": 744108032, "packets_sent": 2565117, "packets_recv": 1318900, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84176896, "bytes_recv": 84176896, "packets_sent": 177667, "packets_recv": 177667, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1168819200, "bytes_recv": 2987008, "packets_sent": 1659574, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591766528, "bytes_recv": 656941056, "packets_sent": 709609, "packets_recv": 1138890, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5301, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2934784, "bytes_recv": 2048, "packets_sent": 10602, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.040312224340438844, "accuracy": 11.35, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 349846656, "params": 2089540, "max_width": 400, "depth": 20, "n_fc_layers": 9, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7b"}, "task_id": "wrapper-38831b7d365ab966ebcabbf100724700", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.222478, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441073.319634, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:11:13.544Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669106176, "vms": 421042208768, "pfaults": 55261, "pageins": 41}, "memory_percent": 3.8947105407714844, "cpu_times": {"user": 4.203765504, "system": 0.544115136, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9550, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532163, "write_count": 2451938, "read_bytes": 97100316672, "write_bytes": 36508528640, "read_time": 1508184, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2950437, "ended_at": 1707423073.3145056, "telemetry_at_end": {"cpu": {"times_avg": {"user": 71318.66, "nice": 0.0, "system": 31989.39, "idle": 275576.35}, "percent_all": 82.1, "times_per_cpu": [{"user": 20488.21, "nice": 0.0, "system": 10299.82, "idle": 4869.32}, {"user": 20823.54, "nice": 0.0, "system": 10624.39, "idle": 4726.98}, {"user": 7478.48, "nice": 0.0, "system": 4011.21, "idle": 26514.68}, {"user": 5344.03, "nice": 0.0, "system": 2215.45, "idle": 30676.33}, {"user": 3758.51, "nice": 0.0, "system": 1212.28, "idle": 33408.82}, {"user": 3001.38, "nice": 0.0, "system": 854.41, "idle": 34569.06}, {"user": 4539.12, "nice": 0.0, "system": 1483.54, "idle": 32406.87}, {"user": 2484.43, "nice": 0.0, "system": 603.58, "idle": 35421.49}, {"user": 1807.43, "nice": 0.0, "system": 374.35, "idle": 36349.62}, {"user": 1593.53, "nice": 0.0, "system": 310.36, "idle": 36633.18}], "percent_per_cpu": [94.7, 94.9, 86.1, 82.6, 79.2, 76.5, 85.7, 80.1, 74.3, 69.5]}, "process": {"pid": 65783, "memory": {"rss": 2711207936, "vms": 424426668032, "pfaults": 27059379, "pageins": 78}, "memory_percent": 15.781307220458984, "cpu_times": {"user": 1892.832772096, "system": 255.988334592, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 7322883, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3467362304, "percent": 79.8, "used": 5821743104, "free": 267763712, "active": 3306848256, "inactive": 3193389056, "wired": 2514894848}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72937652224, "sout": 2776137728}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745181741056, "percent": 1.3}, "io_sum": {"read_count": 5594155, "write_count": 2473770, "read_bytes": 98130231296, "write_bytes": 37248884736, "read_time": 1519952, "write_time": 189466}}, "network": {"netio_sum": {"bytes_sent": 1850649600, "bytes_recv": 744598528, "packets_sent": 2567759, "packets_recv": 1321138, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84489216, "bytes_recv": 84489216, "packets_sent": 179141, "packets_recv": 179141, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1169105920, "bytes_recv": 2987008, "packets_sent": 1660168, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592003072, "bytes_recv": 657119232, "packets_sent": 710169, "packets_recv": 1139654, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5305, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2935808, "bytes_recv": 2048, "packets_sent": 10610, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.05813799858093262, "accuracy": 11.35, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 5709692544, "params": 43930540, "max_width": 4000, "depth": 28, "n_fc_layers": 17, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=500, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=500, out_features=1000, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=1000, out_features=1500, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=1500, out_features=2000, bias=True)\n (8): Softmax(dim=1)\n (9): Linear(in_features=2000, out_features=2500, bias=True)\n (10): Softmax(dim=1)\n (11): Linear(in_features=2500, out_features=3000, bias=True)\n (12): Softmax(dim=1)\n (13): Linear(in_features=3000, out_features=3500, bias=True)\n (14): Softmax(dim=1)\n (15): Linear(in_features=3500, out_features=4000, bias=True)\n (16): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7c"}, "task_id": "wrapper-6263deaaf14bd92c1a0cd21aa19468d3", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.226194, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441381.146931, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:16:23.840Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669450240, "vms": 421136318464, "pfaults": 55285, "pageins": 41}, "memory_percent": 3.8967132568359375, "cpu_times": {"user": 4.204357888, "system": 0.545089344, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9575, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532181, "write_count": 2451938, "read_bytes": 97109753856, "write_bytes": 36508528640, "read_time": 1508201, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2957325, "ended_at": 1707423381.1434336, "telemetry_at_end": {"cpu": {"times_avg": {"user": 73103.52, "nice": 0.0, "system": 32373.78, "idle": 276408.01}, "percent_all": 72.3, "times_per_cpu": [{"user": 20667.17, "nice": 0.0, "system": 10376.69, "idle": 4892.5}, {"user": 21003.46, "nice": 0.0, "system": 10704.45, "idle": 4749.77}, {"user": 7669.11, "nice": 0.0, "system": 4052.91, "idle": 26584.21}, {"user": 5522.52, "nice": 0.0, "system": 2249.51, "idle": 30767.73}, {"user": 3927.94, "nice": 0.0, "system": 1240.4, "idle": 33515.68}, {"user": 3169.96, "nice": 0.0, "system": 878.18, "idle": 34681.94}, {"user": 4747.23, "nice": 0.0, "system": 1516.96, "idle": 32470.87}, {"user": 2674.22, "nice": 0.0, "system": 631.46, "idle": 35509.6}, {"user": 1973.52, "nice": 0.0, "system": 395.45, "idle": 36468.46}, {"user": 1748.39, "nice": 0.0, "system": 327.77, "idle": 36767.25}], "percent_per_cpu": [91.7, 91.9, 77.0, 69.9, 64.9, 63.0, 79.1, 71.2, 61.2, 56.2]}, "process": {"pid": 65783, "memory": {"rss": 1637482496, "vms": 423204651008, "pfaults": 35077929, "pageins": 78}, "memory_percent": 9.531402587890625, "cpu_times": {"user": 3224.91777024, "system": 355.336126464, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 10085237, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4018012160, "percent": 76.6, "used": 5929762816, "free": 577863680, "active": 3448963072, "inactive": 3433234432, "wired": 2480799744}, "swap": {"total": 3221225472, "used": 2005729280, "free": 1215496192, "percent": 62.3, "sin": 73111584768, "sout": 2796568576}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745175134208, "percent": 1.3}, "io_sum": {"read_count": 5611200, "write_count": 2483569, "read_bytes": 98348826624, "write_bytes": 37355044864, "read_time": 1523526, "write_time": 190420}}, "network": {"netio_sum": {"bytes_sent": 1853680640, "bytes_recv": 746610688, "packets_sent": 2577899, "packets_recv": 1329965, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 85607424, "bytes_recv": 85607424, "packets_sent": 184922, "packets_recv": 184922, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1170149376, "bytes_recv": 2987008, "packets_sent": 1662388, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592861184, "bytes_recv": 658013184, "packets_sent": 712252, "packets_recv": 1142700, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1470464, "bytes_recv": 1024, "packets_sent": 5321, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2941952, "bytes_recv": 2048, "packets_sent": 10642, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.018207813382148743, "accuracy": 10.09, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 1810792832, "params": 8485880, "max_width": 120, "depth": 20, "n_fc_layers": 5, "n_cv_layers": 15, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 30, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(30, 60, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(60, 90, kernel_size=(1, 1), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n (11): Conv2d(90, 120, kernel_size=(28, 28), stride=(1, 1))\n (12): Dropout(p=0.5, inplace=False)\n (13): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (14): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=120, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7d"}, "task_id": "wrapper-aaab0307f93411e5ca7e5c90fb25363f", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.229976, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441381.827315, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:16:23.841Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.65, "nice": 0.0, "system": 3943.9, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.84}], "percent_per_cpu": [0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 671678464, "vms": 421136318464, "pfaults": 55424, "pageins": 41}, "memory_percent": 3.9096832275390625, "cpu_times": {"user": 4.204916992, "system": 0.546187328, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9597, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532205, "write_count": 2451938, "read_bytes": 97122336768, "write_bytes": 36508528640, "read_time": 1508254, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2960467, "ended_at": 1707423381.8261065, "telemetry_at_end": {"cpu": {"times_avg": {"user": 73106.63, "nice": 0.0, "system": 32374.54, "idle": 276410.81}, "percent_all": 58.0, "times_per_cpu": [{"user": 20667.56, "nice": 0.0, "system": 10376.86, "idle": 4892.56}, {"user": 21003.86, "nice": 0.0, "system": 10704.63, "idle": 4749.83}, {"user": 7669.51, "nice": 0.0, "system": 4052.99, "idle": 26584.4}, {"user": 5522.81, "nice": 0.0, "system": 2249.59, "idle": 30768.02}, {"user": 3928.23, "nice": 0.0, "system": 1240.45, "idle": 33516.03}, {"user": 3170.22, "nice": 0.0, "system": 878.2, "idle": 34682.32}, {"user": 4747.66, "nice": 0.0, "system": 1517.03, "idle": 32471.04}, {"user": 2674.45, "nice": 0.0, "system": 631.51, "idle": 35510.0}, {"user": 1973.67, "nice": 0.0, "system": 395.48, "idle": 36468.97}, {"user": 1748.66, "nice": 0.0, "system": 327.8, "idle": 36767.64}], "percent_per_cpu": [90.3, 90.6, 71.6, 56.1, 49.3, 42.4, 74.6, 41.2, 26.1, 43.5]}, "process": {"pid": 65783, "memory": {"rss": 1977368576, "vms": 423529218048, "pfaults": 35100524, "pageins": 78}, "memory_percent": 11.50979995727539, "cpu_times": {"user": 3226.868645888, "system": 355.469688832, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 10088695, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4018028544, "percent": 76.6, "used": 5929762816, "free": 577863680, "active": 3448963072, "inactive": 3433250816, "wired": 2480799744}, "swap": {"total": 3221225472, "used": 2005729280, "free": 1215496192, "percent": 62.3, "sin": 73111584768, "sout": 2796568576}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174818816, "percent": 1.3}, "io_sum": {"read_count": 5611208, "write_count": 2483696, "read_bytes": 98348859392, "write_bytes": 37355962368, "read_time": 1523530, "write_time": 190424}}, "network": {"netio_sum": {"bytes_sent": 1853688832, "bytes_recv": 746618880, "packets_sent": 2577929, "packets_recv": 1329995, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 85615616, "bytes_recv": 85615616, "packets_sent": 184950, "packets_recv": 184950, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1170149376, "bytes_recv": 2987008, "packets_sent": 1662389, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592861184, "bytes_recv": 658013184, "packets_sent": 712253, "packets_recv": 1142702, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1470464, "bytes_recv": 1024, "packets_sent": 5321, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2941952, "bytes_recv": 2048, "packets_sent": 10642, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.04012699522972107, "accuracy": 11.35, "responsible_ai_metrics": {"shap_sum": 0.0, "flops": 1836827776, "params": 8687730, "max_width": 400, "depth": 24, "n_fc_layers": 9, "n_cv_layers": 15, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 30, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(30, 60, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(60, 90, kernel_size=(1, 1), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n (11): Conv2d(90, 120, kernel_size=(28, 28), stride=(1, 1))\n (12): Dropout(p=0.5, inplace=False)\n (13): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (14): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=120, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7e"}, "task_id": "wrapper-2fbec52a0c55740d637e5953e28f8cd5", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.234151, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440728.292082, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:05:33.174Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.65, "nice": 0.0, "system": 3943.9, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.84}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 676757504, "vms": 421136318464, "pfaults": 55736, "pageins": 41}, "memory_percent": 3.9392471313476562, "cpu_times": {"user": 4.205833728, "system": 0.548332608, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9648, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532226, "write_count": 2451938, "read_bytes": 97133346816, "write_bytes": 36508528640, "read_time": 1508328, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true}] \ No newline at end of file +[{"_id": {"$oid": "65c5340c8742cbf9f72b8b76"}, "task_id": "wrapper-485dd60db4213e5872437b332bd60646", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.202881, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440787.422988, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:06:28.267Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.74, "nice": 0.0, "system": 31287.57, "idle": 275323.65}, "percent_all": 32.1, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.8, "nice": 0.0, "system": 789.5, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.57}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [90.0, 90.8, 42.6, 48.5, 22.2, 17.4, 17.5, 6.3, 1.4, 0.6]}, "process": {"pid": 65783, "memory": {"rss": 661061632, "vms": 420960452608, "pfaults": 54581, "pageins": 39}, "memory_percent": 3.8478851318359375, "cpu_times": {"user": 4.154982912, "system": 0.53017664, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035182592, "percent": 76.5, "used": 6553665536, "free": 43483136, "active": 4002627584, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2845347, "ended_at": 1707422787.4181814, "telemetry_at_end": {"cpu": {"times_avg": {"user": 69331.19, "nice": 0.0, "system": 31442.88, "idle": 275340.35}, "percent_all": 97.1, "times_per_cpu": [{"user": 20321.25, "nice": 0.0, "system": 10220.4, "idle": 4860.67}, {"user": 20654.02, "nice": 0.0, "system": 10542.05, "idle": 4718.38}, {"user": 7270.46, "nice": 0.0, "system": 3959.04, "idle": 26496.36}, {"user": 5137.06, "nice": 0.0, "system": 2163.8, "idle": 30653.95}, {"user": 3554.7, "nice": 0.0, "system": 1161.07, "idle": 33382.5}, {"user": 2799.19, "nice": 0.0, "system": 804.99, "idle": 34538.89}, {"user": 4324.65, "nice": 0.0, "system": 1435.86, "idle": 32386.28}, {"user": 2274.43, "nice": 0.0, "system": 557.38, "idle": 35394.7}, {"user": 1602.2, "nice": 0.0, "system": 330.17, "idle": 36316.01}, {"user": 1393.23, "nice": 0.0, "system": 268.12, "idle": 36592.61}], "percent_per_cpu": [98.8, 98.8, 98.0, 97.7, 97.1, 96.6, 97.3, 96.5, 95.8, 95.3]}, "process": {"pid": 65783, "memory": {"rss": 3381313536, "vms": 425213526016, "pfaults": 7183545, "pageins": 78}, "memory_percent": 19.681835174560547, "cpu_times": {"user": 318.797152256, "system": 60.949655552, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 2007025, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3256057856, "percent": 81.0, "used": 5652824064, "free": 162594816, "active": 3034939392, "inactive": 3080241152, "wired": 2617884672}, "swap": {"total": 3221225472, "used": 2039283712, "free": 1181941760, "percent": 63.3, "sin": 72424914944, "sout": 2752135168}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174777856, "percent": 1.3}, "io_sum": {"read_count": 5549128, "write_count": 2463475, "read_bytes": 97503764480, "write_bytes": 37131018240, "read_time": 1512266, "write_time": 188503}}, "network": {"netio_sum": {"bytes_sent": 1846870016, "bytes_recv": 742617088, "packets_sent": 2557570, "packets_recv": 1312601, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83288064, "bytes_recv": 83288064, "packets_sent": 173708, "packets_recv": 173708, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167385600, "bytes_recv": 2987008, "packets_sent": 1657528, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591150080, "bytes_recv": 656338944, "packets_sent": 708098, "packets_recv": 1136550, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5292, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10584, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.014728536784648895, "accuracy": 40.75, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 21880192, "params": 162990, "max_width": 100, "depth": 12, "n_fc_layers": 5, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b77"}, "task_id": "wrapper-493b030fcaf36a06a9305f23af63d469", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.206701, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440789.350381, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:06:33.280Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 50.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.5, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661127168, "vms": 420960452608, "pfaults": 54587, "pageins": 39}, "memory_percent": 3.8482666015625, "cpu_times": {"user": 4.15573376, "system": 0.530893408, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2848635, "ended_at": 1707422789.3468654, "telemetry_at_end": {"cpu": {"times_avg": {"user": 69345.17, "nice": 0.0, "system": 31446.98, "idle": 275340.83}, "percent_all": 97.4, "times_per_cpu": [{"user": 20322.29, "nice": 0.0, "system": 10220.95, "idle": 4860.69}, {"user": 20655.1, "nice": 0.0, "system": 10542.67, "idle": 4718.4}, {"user": 7271.93, "nice": 0.0, "system": 3959.42, "idle": 26496.4}, {"user": 5138.52, "nice": 0.0, "system": 2164.2, "idle": 30653.99}, {"user": 3556.15, "nice": 0.0, "system": 1161.48, "idle": 33382.55}, {"user": 2800.68, "nice": 0.0, "system": 805.35, "idle": 34538.95}, {"user": 4326.13, "nice": 0.0, "system": 1436.22, "idle": 32386.33}, {"user": 2275.92, "nice": 0.0, "system": 557.73, "idle": 35394.76}, {"user": 1603.69, "nice": 0.0, "system": 330.53, "idle": 36316.07}, {"user": 1394.76, "nice": 0.0, "system": 268.43, "idle": 36592.69}], "percent_per_cpu": [98.8, 98.8, 97.9, 97.9, 97.4, 96.9, 97.4, 96.8, 96.9, 95.8]}, "process": {"pid": 65783, "memory": {"rss": 3336765440, "vms": 425309650944, "pfaults": 7344341, "pageins": 78}, "memory_percent": 19.422531127929688, "cpu_times": {"user": 330.297311232, "system": 62.648221696, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 2053429, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3104882688, "percent": 81.9, "used": 5665767424, "free": 56360960, "active": 3065348096, "inactive": 3033595904, "wired": 2600419328}, "swap": {"total": 3221225472, "used": 2039283712, "free": 1181941760, "percent": 63.3, "sin": 72426586112, "sout": 2752135168}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174609920, "percent": 1.3}, "io_sum": {"read_count": 5549381, "write_count": 2463773, "read_bytes": 97506377728, "write_bytes": 37134004224, "read_time": 1512322, "write_time": 188518}}, "network": {"netio_sum": {"bytes_sent": 1846901760, "bytes_recv": 742648832, "packets_sent": 2557664, "packets_recv": 1312697, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83316736, "bytes_recv": 83316736, "packets_sent": 173778, "packets_recv": 173778, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167387648, "bytes_recv": 2987008, "packets_sent": 1657540, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591151104, "bytes_recv": 656342016, "packets_sent": 708110, "packets_recv": 1136576, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5292, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10584, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.040325844478607174, "accuracy": 11.35, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 47275136, "params": 359840, "max_width": 400, "depth": 16, "n_fc_layers": 9, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b78"}, "task_id": "wrapper-e944d8660800c2d4f1fa1ccd2f2cad53", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.210366, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 10], [10, 20]], "conv_kernel_sizes": [1, 28], "conv_pool_sizes": [1, 1], "fc_in_outs": [[20, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440897.270892, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:08:18.388Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.51, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.76}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661143552, "vms": 420960452608, "pfaults": 54590, "pageins": 39}, "memory_percent": 3.8483619689941406, "cpu_times": {"user": 4.156226048, "system": 0.53132896, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9270, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2850378, "ended_at": 1707422897.2668266, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70113.51, "nice": 0.0, "system": 31689.0, "idle": 275374.34}, "percent_all": 96.8, "times_per_cpu": [{"user": 20383.98, "nice": 0.0, "system": 10253.28, "idle": 4862.54}, {"user": 20717.96, "nice": 0.0, "system": 10576.36, "idle": 4720.29}, {"user": 7351.72, "nice": 0.0, "system": 3982.15, "idle": 26498.8}, {"user": 5218.72, "nice": 0.0, "system": 2187.17, "idle": 30656.69}, {"user": 3635.61, "nice": 0.0, "system": 1184.78, "idle": 33385.72}, {"user": 2879.99, "nice": 0.0, "system": 828.64, "idle": 34542.48}, {"user": 4407.94, "nice": 0.0, "system": 1457.68, "idle": 32389.64}, {"user": 2357.31, "nice": 0.0, "system": 578.94, "idle": 35398.87}, {"user": 1684.99, "nice": 0.0, "system": 351.12, "idle": 36320.89}, {"user": 1475.29, "nice": 0.0, "system": 288.88, "idle": 36598.42}], "percent_per_cpu": [98.1, 98.1, 97.7, 97.4, 97.0, 96.7, 96.9, 96.1, 95.5, 94.6]}, "process": {"pid": 65783, "memory": {"rss": 2892447744, "vms": 424287944704, "pfaults": 17131115, "pageins": 78}, "memory_percent": 16.836261749267578, "cpu_times": {"user": 946.686656512, "system": 154.097467392, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 29, "num_ctx_switches": {"voluntary": 4541085, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3876110336, "percent": 77.4, "used": 5258297344, "free": 794689536, "active": 2775171072, "inactive": 3078914048, "wired": 2483126272}, "swap": {"total": 3221225472, "used": 2022506496, "free": 1198718976, "percent": 62.8, "sin": 72791949312, "sout": 2760916992}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745176145920, "percent": 1.3}, "io_sum": {"read_count": 5580885, "write_count": 2467115, "read_bytes": 97946849280, "write_bytes": 37170196480, "read_time": 1516773, "write_time": 188881}}, "network": {"netio_sum": {"bytes_sent": 1848044544, "bytes_recv": 743379968, "packets_sent": 2561282, "packets_recv": 1315877, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 83763200, "bytes_recv": 83763200, "packets_sent": 175804, "packets_recv": 175804, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167768576, "bytes_recv": 2987008, "packets_sent": 1658349, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591464448, "bytes_recv": 656626688, "packets_sent": 708879, "packets_recv": 1137730, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5296, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2933760, "bytes_recv": 2048, "packets_sent": 10592, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.05815730080604553, "accuracy": 11.35, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 5405073024, "params": 42184840, "max_width": 4000, "depth": 24, "n_fc_layers": 17, "n_cv_layers": 7, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 10, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(10, 20, kernel_size=(28, 28), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=20, out_features=500, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=500, out_features=1000, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=1000, out_features=1500, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=1500, out_features=2000, bias=True)\n (8): Softmax(dim=1)\n (9): Linear(in_features=2000, out_features=2500, bias=True)\n (10): Softmax(dim=1)\n (11): Linear(in_features=2500, out_features=3000, bias=True)\n (12): Softmax(dim=1)\n (13): Linear(in_features=3000, out_features=3500, bias=True)\n (14): Softmax(dim=1)\n (15): Linear(in_features=3500, out_features=4000, bias=True)\n (16): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b79"}, "task_id": "wrapper-e0b4c651a646dfa7893e53b2241ff836", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.213765, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440992.752261, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:09:53.463Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.33, "nice": 0.0, "system": 10201.06, "idle": 4860.06}, {"user": 20621.5, "nice": 0.0, "system": 10521.84, "idle": 4717.75}, {"user": 7229.62, "nice": 0.0, "system": 3943.88, "idle": 26495.17}, {"user": 5096.1, "nice": 0.0, "system": 2148.4, "idle": 30652.58}, {"user": 3514.08, "nice": 0.0, "system": 1145.56, "idle": 33380.78}, {"user": 2758.81, "nice": 0.0, "system": 789.51, "idle": 34536.87}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.64}, {"user": 2231.72, "nice": 0.0, "system": 543.83, "idle": 35392.58}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.47}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.77}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 661159936, "vms": 420960452608, "pfaults": 54593, "pageins": 39}, "memory_percent": 3.8484573364257812, "cpu_times": {"user": 4.156712448, "system": 0.531758656, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 6, "num_ctx_switches": {"voluntary": 9271, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5531998, "write_count": 2451936, "read_bytes": 97097482240, "write_bytes": 36508495872, "read_time": 1508175, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846027264, "bytes_recv": 742011904, "packets_sent": 2555393, "packets_recv": 1310688, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82888704, "bytes_recv": 82888704, "packets_sent": 172575, "packets_recv": 172575, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2852035, "ended_at": 1707422992.7469294, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70796.36, "nice": 0.0, "system": 31867.17, "idle": 275437.88}, "percent_all": 93.1, "times_per_cpu": [{"user": 20439.66, "nice": 0.0, "system": 10279.64, "idle": 4865.53}, {"user": 20774.45, "nice": 0.0, "system": 10603.53, "idle": 4723.28}, {"user": 7422.93, "nice": 0.0, "system": 3998.9, "idle": 26503.82}, {"user": 5289.94, "nice": 0.0, "system": 2203.8, "idle": 30662.74}, {"user": 3706.11, "nice": 0.0, "system": 1201.52, "idle": 33392.47}, {"user": 2949.95, "nice": 0.0, "system": 844.72, "idle": 34550.54}, {"user": 4481.16, "nice": 0.0, "system": 1472.97, "idle": 32395.56}, {"user": 2430.16, "nice": 0.0, "system": 593.75, "idle": 35405.72}, {"user": 1756.79, "nice": 0.0, "system": 365.5, "idle": 36329.21}, {"user": 1545.21, "nice": 0.0, "system": 302.84, "idle": 36609.01}], "percent_per_cpu": [96.5, 96.5, 94.6, 93.6, 92.8, 91.4, 93.7, 92.8, 91.2, 88.8]}, "process": {"pid": 65783, "memory": {"rss": 2850635776, "vms": 424779087872, "pfaults": 23593031, "pageins": 78}, "memory_percent": 16.592884063720703, "cpu_times": {"user": 1490.718031872, "system": 217.113657344, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 6293997, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3341893632, "percent": 80.5, "used": 5749145600, "free": 98893824, "active": 3247390720, "inactive": 3235725312, "wired": 2501754880}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72856813568, "sout": 2768257024}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745172246528, "percent": 1.3}, "io_sum": {"read_count": 5587993, "write_count": 2470679, "read_bytes": 98035175424, "write_bytes": 37206433792, "read_time": 1518483, "write_time": 189195}}, "network": {"netio_sum": {"bytes_sent": 1849780224, "bytes_recv": 744077312, "packets_sent": 2565007, "packets_recv": 1318796, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84154368, "bytes_recv": 84154368, "packets_sent": 177605, "packets_recv": 177605, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1168813056, "bytes_recv": 2987008, "packets_sent": 1659550, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591762432, "bytes_recv": 656932864, "packets_sent": 709585, "packets_recv": 1138848, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5301, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2934784, "bytes_recv": 2048, "packets_sent": 10602, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.018241909003257752, "accuracy": 10.28, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 324195712, "params": 1890690, "max_width": 100, "depth": 16, "n_fc_layers": 5, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7a"}, "task_id": "wrapper-74824901e409ecc16236f3e847d16d2d", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.218762, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440994.537758, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:09:58.471Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.6}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [83.3, 85.7, 42.9, 66.7, 28.6, 14.3, 0.0, 14.3, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669302784, "vms": 421042208768, "pfaults": 55258, "pageins": 41}, "memory_percent": 3.895854949951172, "cpu_times": {"user": 4.203065088, "system": 0.543155456, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 31, "num_connections": 6, "num_open_files": 3, "num_threads": 10, "num_ctx_switches": {"voluntary": 9509, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532161, "write_count": 2451938, "read_bytes": 97099530240, "write_bytes": 36508528640, "read_time": 1508184, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2941866, "ended_at": 1707422994.5367415, "telemetry_at_end": {"cpu": {"times_avg": {"user": 70809.33, "nice": 0.0, "system": 31870.03, "idle": 275439.53}, "percent_all": 90.6, "times_per_cpu": [{"user": 20440.87, "nice": 0.0, "system": 10280.08, "idle": 4865.53}, {"user": 20775.66, "nice": 0.0, "system": 10604.0, "idle": 4723.28}, {"user": 7424.28, "nice": 0.0, "system": 3999.14, "idle": 26503.99}, {"user": 5291.3, "nice": 0.0, "system": 2204.07, "idle": 30662.87}, {"user": 3707.4, "nice": 0.0, "system": 1201.79, "idle": 33392.67}, {"user": 2951.25, "nice": 0.0, "system": 844.98, "idle": 34550.75}, {"user": 4482.54, "nice": 0.0, "system": 1473.23, "idle": 32395.69}, {"user": 2431.47, "nice": 0.0, "system": 593.99, "idle": 35405.95}, {"user": 1758.06, "nice": 0.0, "system": 365.71, "idle": 36329.51}, {"user": 1546.5, "nice": 0.0, "system": 303.04, "idle": 36609.29}], "percent_per_cpu": [100.0, 100.0, 90.3, 92.6, 88.6, 88.1, 92.7, 87.1, 83.1, 84.2]}, "process": {"pid": 65783, "memory": {"rss": 2825043968, "vms": 424423047168, "pfaults": 23660249, "pageins": 78}, "memory_percent": 16.443920135498047, "cpu_times": {"user": 1500.83928064, "system": 218.118602752, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 6320493, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3546005504, "percent": 79.4, "used": 5691146240, "free": 353452032, "active": 3214098432, "inactive": 3183362048, "wired": 2477047808}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72872804352, "sout": 2768879616}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745171800064, "percent": 1.3}, "io_sum": {"read_count": 5588541, "write_count": 2470698, "read_bytes": 98052403200, "write_bytes": 37207339008, "read_time": 1518600, "write_time": 189196}}, "network": {"netio_sum": {"bytes_sent": 1849812992, "bytes_recv": 744108032, "packets_sent": 2565117, "packets_recv": 1318900, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84176896, "bytes_recv": 84176896, "packets_sent": 177667, "packets_recv": 177667, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1168819200, "bytes_recv": 2987008, "packets_sent": 1659574, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 591766528, "bytes_recv": 656941056, "packets_sent": 709609, "packets_recv": 1138890, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5301, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2934784, "bytes_recv": 2048, "packets_sent": 10602, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.040312224340438844, "accuracy": 11.35, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 349846656, "params": 2089540, "max_width": 400, "depth": 20, "n_fc_layers": 9, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7b"}, "task_id": "wrapper-38831b7d365ab966ebcabbf100724700", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.222478, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 20], [20, 40], [40, 60]], "conv_kernel_sizes": [1, 1, 28], "conv_pool_sizes": [1, 1, 1], "fc_in_outs": [[60, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441073.319634, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:11:13.544Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669106176, "vms": 421042208768, "pfaults": 55261, "pageins": 41}, "memory_percent": 3.8947105407714844, "cpu_times": {"user": 4.203765504, "system": 0.544115136, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9550, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532163, "write_count": 2451938, "read_bytes": 97100316672, "write_bytes": 36508528640, "read_time": 1508184, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2950437, "ended_at": 1707423073.3145056, "telemetry_at_end": {"cpu": {"times_avg": {"user": 71318.66, "nice": 0.0, "system": 31989.39, "idle": 275576.35}, "percent_all": 82.1, "times_per_cpu": [{"user": 20488.21, "nice": 0.0, "system": 10299.82, "idle": 4869.32}, {"user": 20823.54, "nice": 0.0, "system": 10624.39, "idle": 4726.98}, {"user": 7478.48, "nice": 0.0, "system": 4011.21, "idle": 26514.68}, {"user": 5344.03, "nice": 0.0, "system": 2215.45, "idle": 30676.33}, {"user": 3758.51, "nice": 0.0, "system": 1212.28, "idle": 33408.82}, {"user": 3001.38, "nice": 0.0, "system": 854.41, "idle": 34569.06}, {"user": 4539.12, "nice": 0.0, "system": 1483.54, "idle": 32406.87}, {"user": 2484.43, "nice": 0.0, "system": 603.58, "idle": 35421.49}, {"user": 1807.43, "nice": 0.0, "system": 374.35, "idle": 36349.62}, {"user": 1593.53, "nice": 0.0, "system": 310.36, "idle": 36633.18}], "percent_per_cpu": [94.7, 94.9, 86.1, 82.6, 79.2, 76.5, 85.7, 80.1, 74.3, 69.5]}, "process": {"pid": 65783, "memory": {"rss": 2711207936, "vms": 424426668032, "pfaults": 27059379, "pageins": 78}, "memory_percent": 15.781307220458984, "cpu_times": {"user": 1892.832772096, "system": 255.988334592, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 7322883, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 3467362304, "percent": 79.8, "used": 5821743104, "free": 267763712, "active": 3306848256, "inactive": 3193389056, "wired": 2514894848}, "swap": {"total": 3221225472, "used": 2014117888, "free": 1207107584, "percent": 62.5, "sin": 72937652224, "sout": 2776137728}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745181741056, "percent": 1.3}, "io_sum": {"read_count": 5594155, "write_count": 2473770, "read_bytes": 98130231296, "write_bytes": 37248884736, "read_time": 1519952, "write_time": 189466}}, "network": {"netio_sum": {"bytes_sent": 1850649600, "bytes_recv": 744598528, "packets_sent": 2567759, "packets_recv": 1321138, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 84489216, "bytes_recv": 84489216, "packets_sent": 179141, "packets_recv": 179141, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1169105920, "bytes_recv": 2987008, "packets_sent": 1660168, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592003072, "bytes_recv": 657119232, "packets_sent": 710169, "packets_recv": 1139654, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1467392, "bytes_recv": 1024, "packets_sent": 5305, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2935808, "bytes_recv": 2048, "packets_sent": 10610, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.05813799858093262, "accuracy": 11.35, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 5709692544, "params": 43930540, "max_width": 4000, "depth": 28, "n_fc_layers": 17, "n_cv_layers": 11, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 20, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(20, 40, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(40, 60, kernel_size=(28, 28), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=60, out_features=500, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=500, out_features=1000, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=1000, out_features=1500, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=1500, out_features=2000, bias=True)\n (8): Softmax(dim=1)\n (9): Linear(in_features=2000, out_features=2500, bias=True)\n (10): Softmax(dim=1)\n (11): Linear(in_features=2500, out_features=3000, bias=True)\n (12): Softmax(dim=1)\n (13): Linear(in_features=3000, out_features=3500, bias=True)\n (14): Softmax(dim=1)\n (15): Linear(in_features=3500, out_features=4000, bias=True)\n (16): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7c"}, "task_id": "wrapper-6263deaaf14bd92c1a0cd21aa19468d3", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.226194, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 50], [50, 100]], "softmax_dims": [null, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441381.146931, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:16:23.840Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.64, "nice": 0.0, "system": 3943.89, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.83}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 669450240, "vms": 421136318464, "pfaults": 55285, "pageins": 41}, "memory_percent": 3.8967132568359375, "cpu_times": {"user": 4.204357888, "system": 0.545089344, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9575, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532181, "write_count": 2451938, "read_bytes": 97109753856, "write_bytes": 36508528640, "read_time": 1508201, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2957325, "ended_at": 1707423381.1434336, "telemetry_at_end": {"cpu": {"times_avg": {"user": 73103.52, "nice": 0.0, "system": 32373.78, "idle": 276408.01}, "percent_all": 72.3, "times_per_cpu": [{"user": 20667.17, "nice": 0.0, "system": 10376.69, "idle": 4892.5}, {"user": 21003.46, "nice": 0.0, "system": 10704.45, "idle": 4749.77}, {"user": 7669.11, "nice": 0.0, "system": 4052.91, "idle": 26584.21}, {"user": 5522.52, "nice": 0.0, "system": 2249.51, "idle": 30767.73}, {"user": 3927.94, "nice": 0.0, "system": 1240.4, "idle": 33515.68}, {"user": 3169.96, "nice": 0.0, "system": 878.18, "idle": 34681.94}, {"user": 4747.23, "nice": 0.0, "system": 1516.96, "idle": 32470.87}, {"user": 2674.22, "nice": 0.0, "system": 631.46, "idle": 35509.6}, {"user": 1973.52, "nice": 0.0, "system": 395.45, "idle": 36468.46}, {"user": 1748.39, "nice": 0.0, "system": 327.77, "idle": 36767.25}], "percent_per_cpu": [91.7, 91.9, 77.0, 69.9, 64.9, 63.0, 79.1, 71.2, 61.2, 56.2]}, "process": {"pid": 65783, "memory": {"rss": 1637482496, "vms": 423204651008, "pfaults": 35077929, "pageins": 78}, "memory_percent": 9.531402587890625, "cpu_times": {"user": 3224.91777024, "system": 355.336126464, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 10085237, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4018012160, "percent": 76.6, "used": 5929762816, "free": 577863680, "active": 3448963072, "inactive": 3433234432, "wired": 2480799744}, "swap": {"total": 3221225472, "used": 2005729280, "free": 1215496192, "percent": 62.3, "sin": 73111584768, "sout": 2796568576}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745175134208, "percent": 1.3}, "io_sum": {"read_count": 5611200, "write_count": 2483569, "read_bytes": 98348826624, "write_bytes": 37355044864, "read_time": 1523526, "write_time": 190420}}, "network": {"netio_sum": {"bytes_sent": 1853680640, "bytes_recv": 746610688, "packets_sent": 2577899, "packets_recv": 1329965, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 85607424, "bytes_recv": 85607424, "packets_sent": 184922, "packets_recv": 184922, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1170149376, "bytes_recv": 2987008, "packets_sent": 1662388, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592861184, "bytes_recv": 658013184, "packets_sent": 712252, "packets_recv": 1142700, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1470464, "bytes_recv": 1024, "packets_sent": 5321, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2941952, "bytes_recv": 2048, "packets_sent": 10642, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.018207813382148743, "accuracy": 10.09, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 1810792832, "params": 8485880, "max_width": 120, "depth": 20, "n_fc_layers": 5, "n_cv_layers": 15, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 30, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(30, 60, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(60, 90, kernel_size=(1, 1), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n (11): Conv2d(90, 120, kernel_size=(28, 28), stride=(1, 1))\n (12): Dropout(p=0.5, inplace=False)\n (13): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (14): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=120, out_features=50, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=50, out_features=100, bias=True)\n (4): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7d"}, "task_id": "wrapper-aaab0307f93411e5ca7e5c90fb25363f", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.229976, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 100], [100, 200], [200, 300], [300, 400]], "softmax_dims": [null, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707441381.827315, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:16:23.841Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.65, "nice": 0.0, "system": 3943.9, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.84}], "percent_per_cpu": [0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 671678464, "vms": 421136318464, "pfaults": 55424, "pageins": 41}, "memory_percent": 3.9096832275390625, "cpu_times": {"user": 4.204916992, "system": 0.546187328, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9597, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532205, "write_count": 2451938, "read_bytes": 97122336768, "write_bytes": 36508528640, "read_time": 1508254, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true, "started_at": 1707422728.2960467, "ended_at": 1707423381.8261065, "telemetry_at_end": {"cpu": {"times_avg": {"user": 73106.63, "nice": 0.0, "system": 32374.54, "idle": 276410.81}, "percent_all": 58.0, "times_per_cpu": [{"user": 20667.56, "nice": 0.0, "system": 10376.86, "idle": 4892.56}, {"user": 21003.86, "nice": 0.0, "system": 10704.63, "idle": 4749.83}, {"user": 7669.51, "nice": 0.0, "system": 4052.99, "idle": 26584.4}, {"user": 5522.81, "nice": 0.0, "system": 2249.59, "idle": 30768.02}, {"user": 3928.23, "nice": 0.0, "system": 1240.45, "idle": 33516.03}, {"user": 3170.22, "nice": 0.0, "system": 878.2, "idle": 34682.32}, {"user": 4747.66, "nice": 0.0, "system": 1517.03, "idle": 32471.04}, {"user": 2674.45, "nice": 0.0, "system": 631.51, "idle": 35510.0}, {"user": 1973.67, "nice": 0.0, "system": 395.48, "idle": 36468.97}, {"user": 1748.66, "nice": 0.0, "system": 327.8, "idle": 36767.64}], "percent_per_cpu": [90.3, 90.6, 71.6, 56.1, 49.3, 42.4, 74.6, 41.2, 26.1, 43.5]}, "process": {"pid": 65783, "memory": {"rss": 1977368576, "vms": 423529218048, "pfaults": 35100524, "pageins": 78}, "memory_percent": 11.50979995727539, "cpu_times": {"user": 3226.868645888, "system": 355.469688832, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 32, "num_connections": 7, "num_open_files": 3, "num_threads": 28, "num_ctx_switches": {"voluntary": 10088695, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4018028544, "percent": 76.6, "used": 5929762816, "free": 577863680, "active": 3448963072, "inactive": 3433250816, "wired": 2480799744}, "swap": {"total": 3221225472, "used": 2005729280, "free": 1215496192, "percent": 62.3, "sin": 73111584768, "sout": 2796568576}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 745174818816, "percent": 1.3}, "io_sum": {"read_count": 5611208, "write_count": 2483696, "read_bytes": 98348859392, "write_bytes": 37355962368, "read_time": 1523530, "write_time": 190424}}, "network": {"netio_sum": {"bytes_sent": 1853688832, "bytes_recv": 746618880, "packets_sent": 2577929, "packets_recv": 1329995, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 85615616, "bytes_recv": 85615616, "packets_sent": 184950, "packets_recv": 184950, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1170149376, "bytes_recv": 2987008, "packets_sent": 1662389, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 592861184, "bytes_recv": 658013184, "packets_sent": 712253, "packets_recv": 1142702, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1470464, "bytes_recv": 1024, "packets_sent": 5321, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2941952, "bytes_recv": 2048, "packets_sent": 10642, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "generated": {"loss": 0.04012699522972107, "accuracy": 11.35, "responsible_ai_metadata": {"shap_sum": 0.0, "flops": 1836827776, "params": 8687730, "max_width": 400, "depth": 24, "n_fc_layers": 9, "n_cv_layers": 15, "convolutional_layers": "Sequential(\n (0): Conv2d(1, 30, kernel_size=(1, 1), stride=(1, 1))\n (1): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (2): ReLU()\n (3): Conv2d(30, 60, kernel_size=(1, 1), stride=(1, 1))\n (4): Dropout(p=0.5, inplace=False)\n (5): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (6): ReLU()\n (7): Conv2d(60, 90, kernel_size=(1, 1), stride=(1, 1))\n (8): Dropout(p=0.5, inplace=False)\n (9): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (10): ReLU()\n (11): Conv2d(90, 120, kernel_size=(28, 28), stride=(1, 1))\n (12): Dropout(p=0.5, inplace=False)\n (13): MaxPool2d(kernel_size=1, stride=1, padding=0, dilation=1, ceil_mode=False)\n (14): ReLU()\n)", "fully_connected_layers": "Sequential(\n (0): Linear(in_features=120, out_features=100, bias=True)\n (1): ReLU()\n (2): Dropout(p=0.5, inplace=False)\n (3): Linear(in_features=100, out_features=200, bias=True)\n (4): Softmax(dim=1)\n (5): Linear(in_features=200, out_features=300, bias=True)\n (6): Softmax(dim=1)\n (7): Linear(in_features=300, out_features=400, bias=True)\n (8): Softmax(dim=1)\n)"}}, "finished": true}, {"_id": {"$oid": "65c5340c8742cbf9f72b8b7e"}, "task_id": "wrapper-2fbec52a0c55740d637e5953e28f8cd5", "custom_metadata": {"scheduler": "tcp://127.0.0.1:64630", "scheduler_id": "Scheduler-dabc6468-0727-4875-aeb3-6cf5934e0084", "scheduler_pid": 65772}, "submitted_at": 1707440728.234151, "activity_id": "wrapper", "used": {"conv_in_outs": [[1, 30], [30, 60], [60, 90], [90, 120]], "conv_kernel_sizes": [1, 1, 1, 28], "conv_pool_sizes": [1, 1, 1, 1], "fc_in_outs": [[120, 500], [500, 1000], [1000, 1500], [1500, 2000], [2000, 2500], [2500, 3000], [3000, 3500], [3500, 4000]], "softmax_dims": [null, 1, 1, 1, 1, 1, 1, 1], "max_epochs": 1}, "workflow_id": "wf_1df28552-c34e-4ee8-8fba-3b3d57b71839", "utc_timestamp": 1707440728.292082, "adapter_id": "dask", "user": "root", "campaign_id": "super_campaign", "sys_name": "Darwin", "node_name": "MAC132633", "login_name": "login_name", "hostname": "mac132633.ornl.gov", "extra_metadata": {"place_holder": ""}, "flowcept_version": "0.1.10", "timestamp": {"$date": "2024-02-08T20:05:33.174Z"}, "debug": true, "submitted": true, "telemetry_at_start": {"cpu": {"times_avg": {"user": 68933.75, "nice": 0.0, "system": 31287.57, "idle": 275323.66}, "percent_all": 0.0, "times_per_cpu": [{"user": 20289.36, "nice": 0.0, "system": 10201.08, "idle": 4860.07}, {"user": 20621.54, "nice": 0.0, "system": 10521.86, "idle": 4717.76}, {"user": 7229.65, "nice": 0.0, "system": 3943.9, "idle": 26495.21}, {"user": 5096.13, "nice": 0.0, "system": 2148.41, "idle": 30652.61}, {"user": 3514.09, "nice": 0.0, "system": 1145.57, "idle": 33380.83}, {"user": 2758.82, "nice": 0.0, "system": 789.51, "idle": 34536.93}, {"user": 4282.01, "nice": 0.0, "system": 1421.8, "idle": 32384.7}, {"user": 2231.72, "nice": 0.0, "system": 543.84, "idle": 35392.64}, {"user": 1559.58, "nice": 0.0, "system": 316.9, "idle": 36313.54}, {"user": 1351.0, "nice": 0.0, "system": 254.8, "idle": 36589.84}], "percent_per_cpu": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "process": {"pid": 65783, "memory": {"rss": 676757504, "vms": 421136318464, "pfaults": 55736, "pageins": 41}, "memory_percent": 3.9392471313476562, "cpu_times": {"user": 4.205833728, "system": 0.548332608, "children_user": 0.0, "children_system": 0.0}, "cpu_percent": 0.0, "executable": "/Users/rsr/opt/miniconda3/envs/flowcept/bin/python3.8", "cmd_line": ["/Users/rsr/opt/miniconda3/envs/flowcept/bin/python", "-c", "from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=42, pipe_handle=53)", "--multiprocessing-fork"], "num_open_file_descriptors": 33, "num_connections": 6, "num_open_files": 5, "num_threads": 10, "num_ctx_switches": {"voluntary": 9648, "involuntary": 0}}, "memory": {"virtual": {"total": 17179869184, "available": 4035198976, "percent": 76.5, "used": 6553649152, "free": 43499520, "active": 4002611200, "inactive": 3826302976, "wired": 2551037952}, "swap": {"total": 2147483648, "used": 1461846016, "free": 685637632, "percent": 68.1, "sin": 72053555200, "sout": 2746744832}}, "disk": {"disk_usage": {"total": 994662584320, "used": 10128703488, "free": 746242007040, "percent": 1.3}, "io_sum": {"read_count": 5532226, "write_count": 2451938, "read_bytes": 97133346816, "write_bytes": 36508528640, "read_time": 1508328, "write_time": 188063}}, "network": {"netio_sum": {"bytes_sent": 1846047744, "bytes_recv": 742032384, "packets_sent": 2555397, "packets_recv": 1310692, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "netio_per_interface": {"lo0": {"bytes_sent": 82909184, "bytes_recv": 82909184, "packets_sent": 172579, "packets_recv": 172579, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "en0": {"bytes_sent": 1167141888, "bytes_recv": 2987008, "packets_sent": 1656994, "packets_recv": 2316, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "utun4": {"bytes_sent": 590950400, "bytes_recv": 656133120, "packets_sent": 707591, "packets_recv": 1135770, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}, "vmenet0": {"bytes_sent": 1466368, "bytes_recv": 1024, "packets_sent": 5291, "packets_recv": 9, "errin": 0, "errout": 0, "dropin": 11453246120, "dropout": 0}, "bridge100": {"bytes_sent": 2932736, "bytes_recv": 2048, "packets_sent": 10582, "packets_recv": 18, "errin": 0, "errout": 0, "dropin": 0, "dropout": 0}}}}, "address": "tcp://127.0.0.1:64635", "running": true}] \ No newline at end of file diff --git a/tests/decorator_tests/flowcept_task_decorator_test.py b/tests/decorator_tests/flowcept_task_decorator_test.py index f4fd2d53..56c98dd1 100644 --- a/tests/decorator_tests/flowcept_task_decorator_test.py +++ b/tests/decorator_tests/flowcept_task_decorator_test.py @@ -1,6 +1,13 @@ +import numpy as np +import psutil import uuid +import random + from time import sleep import pandas as pd +from time import time, sleep + +from flowcept.commons import FlowceptLogger import flowcept.commons import flowcept.instrumentation.decorators @@ -8,26 +15,131 @@ import unittest -from flowcept.instrumentation.decorators.flowcept_task import flowcept_task +from flowcept.commons.utils import assert_by_querying_tasks_until +from flowcept.instrumentation.decorators.flowcept_task import ( + flowcept_task, + lightweight_flowcept_task, +) + + +def calc_time_to_sleep() -> float: + l = list() + matrix_size = 100 + t0 = time() + matrix_a = np.random.rand(matrix_size, matrix_size) + matrix_b = np.random.rand(matrix_size, matrix_size) + result_matrix = np.dot(matrix_a, matrix_b) + d = dict( + a=time(), + b=str(uuid.uuid4()), + c="aaa", + d=123.4, + e={"r": random.randint(1, 100)}, + shape=list(result_matrix.shape), + ) + l.append(d) + t1 = time() + return (t1 - t0) * 1.1 + + +TIME_TO_SLEEP = calc_time_to_sleep() @flowcept_task def decorated_static_function(df: pd.DataFrame, workflow_id=None): - return {"y": 2} + return {"decorated_static_function": 2} -@flowcept_task +@lightweight_flowcept_task +def decorated_all_serializable(x: int, workflow_id: str = None): + sleep(TIME_TO_SLEEP) + return {"yy": 33} + + +def not_decorated_func(x: int, workflow_id: str = None): + sleep(TIME_TO_SLEEP) + return {"yy": 33} + + +@lightweight_flowcept_task def decorated_static_function2(workflow_id=None): return [2] -@flowcept_task +@lightweight_flowcept_task def decorated_static_function3(x, workflow_id=None): return 3 +def compute_statistics(array): + import numpy as np + + stats = { + "mean": np.mean(array), + "median": np.median(array), + "std_dev": np.std(array), + "variance": np.var(array), + "min_value": np.min(array), + "max_value": np.max(array), + "10th_percentile": np.percentile(array, 10), + "25th_percentile": np.percentile(array, 25), + "75th_percentile": np.percentile(array, 75), + "90th_percentile": np.percentile(array, 90), + } + return stats + + +def calculate_overheads(decorated, not_decorated): + keys = [ + "median", + "25th_percentile", + "75th_percentile", + "10th_percentile", + "90th_percentile", + ] + mean_diff = sum( + abs(decorated[key] - not_decorated[key]) for key in keys + ) / len(keys) + overheads = [mean_diff / not_decorated[key] * 100 for key in keys] + return overheads + + +def print_system_stats(): + # CPU utilization + cpu_percent = psutil.cpu_percent(interval=1) + + # Memory utilization + virtual_memory = psutil.virtual_memory() + memory_total = virtual_memory.total + memory_used = virtual_memory.used + memory_percent = virtual_memory.percent + + # Disk utilization + disk_usage = psutil.disk_usage("/") + disk_total = disk_usage.total + disk_used = disk_usage.used + disk_percent = disk_usage.percent + + # Network utilization + net_io = psutil.net_io_counters() + bytes_sent = net_io.bytes_sent + bytes_recv = net_io.bytes_recv + + print("System Utilization Summary:") + print(f"CPU Usage: {cpu_percent}%") + print( + f"Memory Usage: {memory_percent}% (Used: {memory_used / (1024 ** 3):.2f} GB / Total: {memory_total / (1024 ** 3):.2f} GB)" + ) + print( + f"Disk Usage: {disk_percent}% (Used: {disk_used / (1024 ** 3):.2f} GB / Total: {disk_total / (1024 ** 3):.2f} GB)" + ) + print( + f"Network Usage: {bytes_sent / (1024 ** 2):.2f} MB sent / {bytes_recv / (1024 ** 2):.2f} MB received" + ) + + class DecoratorTests(unittest.TestCase): - @flowcept_task + @lightweight_flowcept_task def decorated_function_with_self(self, x, workflow_id=None): sleep(x) return {"y": 2} @@ -35,11 +147,105 @@ def decorated_function_with_self(self, x, workflow_id=None): def test_decorated_function(self): workflow_id = str(uuid.uuid4()) # TODO :refactor-base-interceptor: - with FlowceptConsumerAPI( - interceptors=flowcept.instrumentation.decorators.instrumentation_interceptor - ): + with FlowceptConsumerAPI(FlowceptConsumerAPI.INSTRUMENTATION): self.decorated_function_with_self(x=0.1, workflow_id=workflow_id) - decorated_static_function(pd.DataFrame(), workflow_id=workflow_id) - decorated_static_function2(workflow_id) - decorated_static_function3(0.1, workflow_id=workflow_id) + decorated_static_function( + df=pd.DataFrame(), workflow_id=workflow_id + ) + decorated_static_function2(workflow_id=workflow_id) + decorated_static_function3(x=0.1, workflow_id=workflow_id) + print(workflow_id) + + assert assert_by_querying_tasks_until( + filter={"workflow_id": workflow_id}, + condition_to_evaluate=lambda docs: len(docs) == 4, + max_time=60, + max_trials=60, + ) + + def test_decorated_function_simple( + self, max_tasks=10, start_doc_inserter=True, check_insertions=True + ): + workflow_id = str(uuid.uuid4()) print(workflow_id) + # TODO :refactor-base-interceptor: + consumer = FlowceptConsumerAPI( + interceptors=FlowceptConsumerAPI.INSTRUMENTATION, + start_doc_inserter=start_doc_inserter, + ) + consumer.start() + t0 = time() + for i in range(max_tasks): + decorated_all_serializable(x=i, workflow_id=workflow_id) + t1 = time() + print("Decorated:") + print_system_stats() + consumer.stop() + decorated = t1 - t0 + print(workflow_id) + + if check_insertions: + assert assert_by_querying_tasks_until( + filter={"workflow_id": workflow_id}, + condition_to_evaluate=lambda docs: len(docs) == max_tasks, + max_time=60, + max_trials=60, + ) + + t0 = time() + for i in range(max_tasks): + not_decorated_func(x=i, workflow_id=workflow_id) + t1 = time() + print("Not Decorated:") + print_system_stats() + not_decorated = t1 - t0 + return decorated, not_decorated + + def test_online_offline(self): + flowcept.configs.DB_FLUSH_MODE = "offline" + # flowcept.instrumentation.decorators.instrumentation_interceptor = ( + # BaseInterceptor(plugin_key=None) + # ) + print("Testing times with offline mode") + self.test_decorated_function_timed() + flowcept.configs.DB_FLUSH_MODE = "online" + # flowcept.instrumentation.decorators.instrumentation_interceptor = ( + # BaseInterceptor(plugin_key=None) + # ) + print("Testing times with online mode") + self.test_decorated_function_timed() + + def test_decorated_function_timed(self): + print() + times = [] + for i in range(10): + times.append( + self.test_decorated_function_simple( + max_tasks=10, # 100000, + check_insertions=False, + start_doc_inserter=False, + ) + ) + decorated = [decorated for decorated, not_decorated in times] + not_decorated = [not_decorated for decorated, not_decorated in times] + + decorated_stats = compute_statistics(decorated) + not_decorated_stats = compute_statistics(not_decorated) + + overheads = calculate_overheads(decorated_stats, not_decorated_stats) + logger = FlowceptLogger() + logger.critical(flowcept.configs.DB_FLUSH_MODE + ";" + str(overheads)) + + n = "00002" + print(f"#n={n}: Online double buffers; buffer size 100") + print(f"decorated_{n} = {decorated_stats}") + print(f"not_decorated_{n} = {not_decorated_stats}") + print(f"diff_{n} = calculate_diff(decorated_{n}, not_decorated_{n})") + print(f"'decorated_{n}': diff_{n},") + print("Mode: " + flowcept.configs.DB_FLUSH_MODE) + threshold = ( + 10 if flowcept.configs.DB_FLUSH_MODE == "offline" else 50 + ) # % + print("Threshold: ", threshold) + print("Overheads: " + str(overheads)) + assert all(map(lambda v: v < threshold, overheads)) diff --git a/tests/decorator_tests/ml_tests/dl_trainer.py b/tests/decorator_tests/ml_tests/dl_trainer.py index c5948723..ade6bee6 100644 --- a/tests/decorator_tests/ml_tests/dl_trainer.py +++ b/tests/decorator_tests/ml_tests/dl_trainer.py @@ -1,21 +1,26 @@ +from uuid import uuid4 + import torch from torchvision import datasets, transforms from torch import nn, optim from torch.nn import functional as F -import flowcept.commons -import flowcept.instrumentation.decorators + from flowcept import ( - model_explainer, - model_profiler, FlowceptConsumerAPI, ) -from flowcept.instrumentation.decorators.flowcept_task import flowcept_task from flowcept.instrumentation.decorators.flowcept_torch import ( - torch_args_handler, register_modules, register_module_as_workflow, + torch_task, ) +from flowcept.instrumentation.decorators.responsible_ai import ( + model_profiler, +) + +import threading + +thread_state = threading.local() class TestNet(nn.Module): @@ -27,12 +32,14 @@ def __init__( fc_in_outs=[[320, 50], [50, 10]], softmax_dims=[-9999, 1], # first value will be ignored parent_workflow_id=None, + parent_task_id=None, ): super(TestNet, self).__init__() - + print("parent workflow id", parent_workflow_id) self.workflow_id = register_module_as_workflow( - self, parent_workflow_id + self, parent_workflow_id=parent_workflow_id ) + self.parent_task_id = parent_task_id Conv2d, Dropout, MaxPool2d, ReLU, Softmax, Linear = register_modules( [ nn.Conv2d, @@ -43,6 +50,7 @@ def __init__( nn.Linear, ], workflow_id=self.workflow_id, + parent_task_id=self.parent_task_id, ) self.model_type = "CNN" @@ -72,7 +80,7 @@ def __init__( self.fc_layers.append(Softmax(dim=softmax_dims[i])) self.view_size = fc_in_outs[0][0] - @flowcept_task(args_handler=torch_args_handler) + @torch_task() def forward(self, x): x = self.conv_layers(x) x = x.view(-1, self.view_size) @@ -82,7 +90,8 @@ def forward(self, x): class ModelTrainer(object): @staticmethod - def build_train_test_loader(batch_size=128): + def build_train_test_loader(batch_size=128, random_seed=0): + torch.manual_seed(random_seed) train_loader = torch.utils.data.DataLoader( datasets.MNIST( "mnist_data", @@ -149,9 +158,9 @@ def _test(model, device, test_loader): "accuracy": 100.0 * correct / len(test_loader.dataset), } + # @model_explainer() @staticmethod @model_profiler() - @model_explainer() def model_fit( conv_in_outs=[[1, 10], [10, 20]], conv_kernel_sizes=[5, 5], @@ -160,16 +169,33 @@ def model_fit( softmax_dims=[-9999, 1], max_epochs=2, workflow_id=None, + random_seed=0, ): - # TODO :base-interceptor-refactor: + try: + from distributed.worker import thread_state + + task_id = thread_state.key + except: + task_id = str(uuid4()) + + torch.manual_seed(random_seed) + + print( + "Workflow id in model_fit", workflow_id + ) # TODO :base-interceptor-refactor: # We are calling the consumer api here (sometimes for the second time) # because we are capturing at two levels: at the model.fit and at # every layer. Can we do it better? with FlowceptConsumerAPI( - flowcept.instrumentation.decorators.instrumentation_interceptor + FlowceptConsumerAPI.INSTRUMENTATION, + bundle_exec_id=workflow_id, + start_doc_inserter=False, ): train_loader, test_loader = ModelTrainer.build_train_test_loader() - device = torch.device("cpu") + if torch.backends.mps.is_available(): + device = torch.device("mps") + else: + device = torch.device("cpu") model = TestNet( conv_in_outs=conv_in_outs, conv_kernel_sizes=conv_kernel_sizes, @@ -191,7 +217,14 @@ def model_fit( batch = next(iter(test_loader)) test_data, _ = batch result = test_info.copy() - result.update({"model": model, "test_data": test_data}) + result.update( + { + "model": model, + "test_data": test_data, + "task_id": task_id, + "random_seed": random_seed, + } + ) return result @staticmethod diff --git a/tests/decorator_tests/ml_tests/llm_tests/decorator_dask_llm_test.py b/tests/decorator_tests/ml_tests/llm_tests/decorator_dask_llm_test.py index 50437668..b077b824 100644 --- a/tests/decorator_tests/ml_tests/llm_tests/decorator_dask_llm_test.py +++ b/tests/decorator_tests/ml_tests/llm_tests/decorator_dask_llm_test.py @@ -6,9 +6,12 @@ from cluster_experiment_utils.utils import generate_configs -from flowcept import FlowceptConsumerAPI +from flowcept import FlowceptConsumerAPI, WorkflowObject, DBAPI from flowcept.commons.flowcept_logger import FlowceptLogger +from flowcept.flowceptor.adapters.dask.dask_plugins import ( + register_dask_workflow, +) from tests.adapters.dask_test_utils import ( setup_local_dask_cluster, close_dask, @@ -22,27 +25,39 @@ class DecoratorDaskLLMTests(unittest.TestCase): - client: Client = None - cluster = None - consumer: FlowceptConsumerAPI = None - def __init__(self, *args, **kwargs): super(DecoratorDaskLLMTests, self).__init__(*args, **kwargs) self.logger = FlowceptLogger() - @classmethod - def setUpClass(cls): - ( - DecoratorDaskLLMTests.client, - DecoratorDaskLLMTests.cluster, - DecoratorDaskLLMTests.consumer, - ) = setup_local_dask_cluster(DecoratorDaskLLMTests.consumer) - def test_llm(self): - ntokens, train_data, val_data, test_data = get_wiki_text() + # Manually registering the DataPrep workflow (manual instrumentation) + tokenizer = "toktok" # basic_english, moses, toktok + db_api = DBAPI() + dataset_prep_wf = WorkflowObject() + dataset_prep_wf.workflow_id = f"prep_wikitext_tokenizer_{tokenizer}" + dataset_prep_wf.used = {"tokenizer": tokenizer} + ntokens, train_data, val_data, test_data = get_wiki_text(tokenizer) + dataset_ref = f"{dataset_prep_wf.workflow_id}_{id(train_data)}_{id(val_data)}_{id(test_data)}" + dataset_prep_wf.generated = { + "ntokens": ntokens, + "dataset_ref": dataset_ref, + "train_data": id(train_data), + "val_data": id(val_data), + "test_data": id(test_data), + } + print(dataset_prep_wf) + db_api.insert_or_update_workflow(dataset_prep_wf) + + # Automatically registering the Dask workflow + train_wf_id = str(uuid.uuid4()) + client, cluster, consumer = setup_local_dask_cluster( + exec_bundle=train_wf_id + ) + register_dask_workflow( + client, workflow_id=train_wf_id, used={"dataset_ref": dataset_ref} + ) - wf_id = str(uuid.uuid4()) - print(f"Workflow_id={wf_id}") + print(f"Model_Train_Wf_id={train_wf_id}") exp_param_settings = { "batch_size": [20], "eval_batch_size": [10], @@ -57,6 +72,7 @@ def test_llm(self): } configs = generate_configs(exp_param_settings) outputs = [] + for conf in configs[:1]: conf.update( { @@ -64,25 +80,13 @@ def test_llm(self): "train_data": train_data, "val_data": val_data, "test_data": test_data, - "workflow_id": wf_id, + "workflow_id": train_wf_id, } ) - outputs.append( - DecoratorDaskLLMTests.client.submit(model_train, **conf) - ) + outputs.append(client.submit(model_train, **conf)) + for o in outputs: o.result() - @classmethod - def tearDownClass(cls): - print("Ending tests!") - try: - close_dask( - DecoratorDaskLLMTests.client, DecoratorDaskLLMTests.cluster - ) - except Exception as e: - print(e) - pass - - if TestDask.consumer: - TestDask.consumer.stop() + close_dask(client, cluster) + consumer.stop() diff --git a/tests/decorator_tests/ml_tests/llm_tests/llm_decorator_test.py b/tests/decorator_tests/ml_tests/llm_tests/llm_decorator_test.py index 673c474b..8f18d283 100644 --- a/tests/decorator_tests/ml_tests/llm_tests/llm_decorator_test.py +++ b/tests/decorator_tests/ml_tests/llm_tests/llm_decorator_test.py @@ -2,11 +2,9 @@ import torch -from flowcept import model_profiler - import unittest - +from flowcept.instrumentation.decorators.responsible_ai import model_profiler from tests.decorator_tests.ml_tests.llm_tests.llm_trainer import ( model_train, get_wiki_text, @@ -78,5 +76,6 @@ def debug_model_profiler(conf, ntokens, test_data): "train_loss": 0.01, "val_loss": 0.01, "model": best_m, + "task_id": str(uuid.uuid4()), "test_data": test_data, } diff --git a/tests/decorator_tests/ml_tests/llm_tests/llm_trainer.py b/tests/decorator_tests/ml_tests/llm_tests/llm_trainer.py index 1913982d..7af1fceb 100644 --- a/tests/decorator_tests/ml_tests/llm_tests/llm_trainer.py +++ b/tests/decorator_tests/ml_tests/llm_tests/llm_trainer.py @@ -1,6 +1,8 @@ # The code in this file is based on: # https://blog.paperspace.com/build-a-language-model-using-pytorch/ import math +from time import time + import torch import torch.nn as nn import torch.optim as optim @@ -9,15 +11,15 @@ from datasets import load_dataset import flowcept -from flowcept import model_profiler, FlowceptConsumerAPI -from flowcept.instrumentation.decorators.flowcept_task import flowcept_task +from flowcept import FlowceptConsumerAPI +from flowcept.configs import N_GPUS + from flowcept.instrumentation.decorators.flowcept_torch import ( register_modules, register_module_as_workflow, - torch_args_handler, + torch_task, ) - -tokenizer = get_tokenizer("basic_english") +from flowcept.instrumentation.decorators.responsible_ai import model_profiler # Define a function to batchify the data @@ -29,14 +31,14 @@ def batchify(data, bsz): # Define a function to yield tokens from the dataset -def yield_tokens(data_iter): +def yield_tokens(tokenizer, data_iter): for item in data_iter: if len(item["text"]): yield tokenizer(item["text"]) # Define a function to process the raw text and convert it to tensors -def data_process(vocab, raw_text_iter): +def data_process(tokenizer, vocab, raw_text_iter): data = [ torch.tensor( [vocab[token] for token in tokenizer(item["text"])], @@ -54,7 +56,9 @@ def get_batch(source, i, bptt=35): return data, target -def get_wiki_text(): +def get_wiki_text( + tokenizer_type="basic_english", +): # spacy, moses, toktok, revtok, subword # Load the WikiText2 dataset dataset = load_dataset("wikitext", "wikitext-2-v1") test_dataset = dataset["test"] @@ -62,14 +66,15 @@ def get_wiki_text(): validation_dataset = dataset["validation"] # Build the vocabulary from the training dataset - vocab = build_vocab_from_iterator(yield_tokens(train_dataset)) + tokenizer = get_tokenizer(tokenizer_type) + vocab = build_vocab_from_iterator(yield_tokens(tokenizer, train_dataset)) vocab.set_default_index(vocab[""]) ntokens = len(vocab) # Process the train, validation, and test datasets - train_data = data_process(vocab, train_dataset) - val_data = data_process(vocab, validation_dataset) - test_data = data_process(vocab, test_dataset) + train_data = data_process(tokenizer, vocab, train_dataset) + val_data = data_process(tokenizer, vocab, validation_dataset) + test_data = data_process(tokenizer, vocab, test_dataset) try: if torch.backends.mps.is_available(): @@ -96,33 +101,40 @@ def __init__( nlayers, dropout=0.5, pos_encoding_max_len=5000, + parent_task_id=None, parent_workflow_id=None, + custom_metadata: dict = None, ): super(TransformerModel, self).__init__() self.workflow_id = register_module_as_workflow( - self, parent_workflow_id + self, parent_workflow_id, custom_metadata ) + self.parent_task_id = parent_task_id ( TransformerEncoderLayer, TransformerEncoder, Embedding, Linear, + PositionalEncoding_, ) = register_modules( - [ + modules=[ nn.TransformerEncoderLayer, nn.TransformerEncoder, nn.Embedding, nn.Linear, + PositionalEncoding, ], workflow_id=self.workflow_id, + parent_task_id=self.parent_task_id, ) self.model_type = "Transformer" self.src_mask = None - self.pos_encoder = PositionalEncoding( + self.pos_encoder = PositionalEncoding_( d_model, dropout, max_len=pos_encoding_max_len, workflow_id=self.workflow_id, + parent_task_id=parent_task_id, ) encoder_layers = TransformerEncoderLayer( d_model, nhead, d_hid, dropout @@ -143,7 +155,8 @@ def _generate_square_subsequent_mask(self, sz): ) return mask - @flowcept_task(args_handler=torch_args_handler) + # @flowcept_task(args_handler=torch_args_handler) + @torch_task() def forward(self, src): if self.src_mask is None or self.src_mask.size(0) != len(src): device = src.device @@ -159,7 +172,14 @@ def forward(self, src): # Define the PositionalEncoding class class PositionalEncoding(nn.Module): - def __init__(self, d_model, dropout=0.1, max_len=5000, workflow_id=None): + def __init__( + self, + d_model, + dropout=0.1, + max_len=5000, + workflow_id=None, + parent_task_id=None, + ): super(PositionalEncoding, self).__init__() self.workflow_id = workflow_id Dropout = register_modules( @@ -167,6 +187,7 @@ def __init__(self, d_model, dropout=0.1, max_len=5000, workflow_id=None): nn.Dropout, ], workflow_id=self.workflow_id, + parent_task_id=parent_task_id, ) self.dropout = Dropout(p=dropout) @@ -182,7 +203,8 @@ def __init__(self, d_model, dropout=0.1, max_len=5000, workflow_id=None): pe = pe.unsqueeze(0).transpose(0, 1) self.register_buffer("pe", pe) - @flowcept_task(args_handler=torch_args_handler) + # @flowcept_task(args_handler=torch_args_handler) + @torch_task() def forward(self, x): x = x + self.pe[: x.size(0), :] return self.dropout(x) @@ -252,10 +274,16 @@ def model_train( pos_encoding_max_len, workflow_id=None, ): + from distributed.worker import thread_state + + dask_task_id = thread_state.key + # TODO :ml-refactor: save device type and random seed: https://pytorch.org/docs/stable/notes/randomness.html # TODO :base-interceptor-refactor: Can we do it better? with FlowceptConsumerAPI( - flowcept.instrumentation.decorators.instrumentation_interceptor + FlowceptConsumerAPI.INSTRUMENTATION, + bundle_exec_id=workflow_id, + start_doc_inserter=False, ): train_data = batchify(train_data, batch_size) val_data = batchify(val_data, eval_batch_size) @@ -279,7 +307,9 @@ def model_train( nlayers, dropout, pos_encoding_max_len, + parent_task_id=dask_task_id, parent_workflow_id=workflow_id, + custom_metadata={"model_step": "train", "cuda_visible": N_GPUS}, ).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=lr) @@ -288,6 +318,7 @@ def model_train( ) # Initialize the best validation loss to infinity # best_m = None # Iterate through the epochs + t0 = time() for epoch in range(1, epochs + 1): print(f"Starting training for epoch {epoch}/{epochs}") # Train the model on the training data and calculate the training loss @@ -312,9 +343,22 @@ def model_train( torch.save(model.state_dict(), "transformer_wikitext2.pth") print("Finished training") + t1 = time() + # Load the best model's state best_m = TransformerModel( - ntokens, emsize, nhead, nhid, nlayers, dropout + ntokens, + emsize, + nhead, + nhid, + nlayers, + dropout, + parent_workflow_id=workflow_id, + parent_task_id=dask_task_id, + custom_metadata={ + "model_step": "test", + "cuda_visible": N_GPUS, + }, ).to(device) print("Loading model") torch_loaded = torch.load("transformer_wikitext2.pth") @@ -326,10 +370,14 @@ def model_train( ntokens, best_m, test_data, criterion, eval_batch_size ) print(f"Test loss: {test_loss:.2f}") + with open("time.txt", "w") as f: + f.write(str(t1 - t0)) return { "test_loss": test_loss, "train_loss": train_loss, "val_loss": val_loss, + "training_time": t1 - t0, "model": model, + "task_id": dask_task_id, } diff --git a/tests/decorator_tests/ml_tests/ml_decorator_dask_test.py b/tests/decorator_tests/ml_tests/ml_decorator_dask_test.py index 1bef0552..13b9be6e 100644 --- a/tests/decorator_tests/ml_tests/ml_decorator_dask_test.py +++ b/tests/decorator_tests/ml_tests/ml_decorator_dask_test.py @@ -1,14 +1,13 @@ import unittest -from uuid import uuid4 - -from dask.distributed import Client - -from flowcept import FlowceptConsumerAPI, WorkflowObject, TaskQueryAPI +from flowcept import TaskQueryAPI from flowcept.commons.flowcept_logger import FlowceptLogger +from flowcept.commons.utils import evaluate_until +from flowcept.flowceptor.adapters.dask.dask_plugins import ( + register_dask_workflow, +) -from flowcept.flowcept_api.db_api import DBAPI from tests.adapters.dask_test_utils import ( setup_local_dask_cluster, close_dask, @@ -17,23 +16,15 @@ class MLDecoratorDaskTests(unittest.TestCase): - client: Client = None - cluster = None - consumer: FlowceptConsumerAPI = None - def __init__(self, *args, **kwargs): super(MLDecoratorDaskTests, self).__init__(*args, **kwargs) self.logger = FlowceptLogger() - @classmethod - def setUpClass(cls): - ( - MLDecoratorDaskTests.client, - MLDecoratorDaskTests.cluster, - MLDecoratorDaskTests.consumer, - ) = setup_local_dask_cluster(MLDecoratorDaskTests.consumer) - def test_model_trains_with_dask(self): + # wf_id = f"{uuid4()}" + client, cluster, consumer = setup_local_dask_cluster( + # exec_bundle=wf_id + ) hp_conf = { "n_conv_layers": [2, 3, 4], "conv_incrs": [10, 20, 30], @@ -43,53 +34,33 @@ def test_model_trains_with_dask(self): "max_epochs": [1], } confs = ModelTrainer.generate_hp_confs(hp_conf) - wf_id = f"{uuid4()}" - confs = [{**d, "workflow_id": wf_id} for d in confs] + hp_conf.update({"n_confs": len(confs)}) + custom_metadata = {"hyperparameter_conf": hp_conf} + wf_id = register_dask_workflow( + client, custom_metadata=custom_metadata + ) print("Workflow id", wf_id) + for conf in confs: + conf["workflow_id"] = wf_id + outputs = [] - wf_obj = WorkflowObject() - wf_obj.workflow_id = wf_id - wf_obj.custom_metadata = { - "hyperparameter_conf": hp_conf.update({"n_confs": len(confs)}) - } - db = DBAPI() - db.insert_or_update_workflow(wf_obj) for conf in confs[:1]: - conf["workflow_id"] = wf_id - outputs.append( - MLDecoratorDaskTests.client.submit( - ModelTrainer.model_fit, **conf - ) - ) + outputs.append(client.submit(ModelTrainer.model_fit, **conf)) for o in outputs: r = o.result() print(r) - assert "responsible_ai_metrics" in r + assert "responsible_ai_metadata" in r + + close_dask(client, cluster) + consumer.stop() # We are creating one "sub-workflow" for every Model.fit, # which requires forwarding on multiple layers - - task_query = TaskQueryAPI() - module_docs = task_query.get_subworkflow_tasks_from_a_parent_workflow( - parent_workflow_id=wf_id - ) - assert len(module_docs) > 0 - - # db.dump_to_file( - # filter={"workflow_id": wf_id}, - # output_file="tmp_sample_data_with_telemetry_and_rai.json", - # ) - - @classmethod - def tearDownClass(cls): - print("Ending tests!") - try: - close_dask( - MLDecoratorDaskTests.client, MLDecoratorDaskTests.cluster + assert evaluate_until( + lambda: len( + TaskQueryAPI().get_subworkflows_tasks_from_a_parent_workflow( + wf_id + ) ) - except Exception as e: - print(e) - pass - - if MLDecoratorDaskTests.consumer: - MLDecoratorDaskTests.consumer.stop() + > 0 + ) diff --git a/tests/decorator_tests/ml_tests/ml_decorator_test.py b/tests/decorator_tests/ml_tests/ml_decorator_test.py index c607f380..fb0c3869 100644 --- a/tests/decorator_tests/ml_tests/ml_decorator_test.py +++ b/tests/decorator_tests/ml_tests/ml_decorator_test.py @@ -2,11 +2,8 @@ import unittest -from flowcept import TaskQueryAPI - -from tests.decorator_tests.ml_tests.dl_trainer import ( - ModelTrainer, -) +from flowcept import DBAPI +from tests.decorator_tests.ml_tests.dl_trainer import ModelTrainer, TestNet class MLDecoratorTests(unittest.TestCase): @@ -28,10 +25,14 @@ def test_cnn_model_trainer(): for conf in confs[:1]: conf["workflow_id"] = wf_id result = trainer.model_fit(**conf) - print(result) + assert len(result) + + c = conf.copy() + c.pop("max_epochs") + c.pop("workflow_id") + loaded_model = TestNet(**c) - task_query = TaskQueryAPI() - module_docs = task_query.get_subworkflow_tasks_from_a_parent_workflow( - parent_workflow_id=wf_id - ) - assert len(module_docs) > 0 + loaded_model = DBAPI().load_torch_model( + loaded_model, result["object_id"] + ) + assert len(loaded_model(result["test_data"])) diff --git a/tests/doc_db_inserter/doc_db_inserter_test.py b/tests/doc_db_inserter/doc_db_inserter_test.py index 5d426dda..4d43711a 100644 --- a/tests/doc_db_inserter/doc_db_inserter_test.py +++ b/tests/doc_db_inserter/doc_db_inserter_test.py @@ -12,12 +12,14 @@ def __init__(self, *args, **kwargs): def test_db(self): c0 = self.doc_dao.count() assert c0 >= 0 - _id = self.doc_dao.insert_one({"dummy": "test"}) + _id = self.doc_dao.insert_one( + {"dummy": "test", "task_id": str(uuid4())} + ) assert _id is not None _ids = self.doc_dao.insert_many( [ - {"dummy1": "test1"}, - {"dummy2": "test2"}, + {"dummy1": "test1", "task_id": str(uuid4())}, + {"dummy2": "test2", "task_id": str(uuid4())}, ] ) assert len(_ids) == 2 @@ -32,6 +34,7 @@ def test_db_insert_and_update_many(self): uid = str(uuid4()) docs = [ { + "task_id": str(uuid4()), "myid": uid, "debug": True, "last_name": "Souza", @@ -40,12 +43,14 @@ def test_db_insert_and_update_many(self): "used": {"any": 1}, }, { + "task_id": str(uuid4()), "myid": uid, "debug": True, "name": "Renan", "status": "SUBMITTED", }, { + "task_id": str(uuid4()), "myid": uid, "debug": True, "name": "Renan2", @@ -56,12 +61,14 @@ def test_db_insert_and_update_many(self): self.doc_dao.insert_and_update_many("myid", docs) docs = [ { + "task_id": str(uuid4()), "myid": uid, "debug": True, "name": "Renan2", "used": {"blub": 3}, }, { + "task_id": str(uuid4()), "myid": uid, "debug": True, "name": "Francisco", @@ -80,11 +87,28 @@ def test_status_updates(self): assert c0 >= 0 uid = str(uuid4()) docs = [ - {"myid": uid, "debug": True, "status": "SUBMITTED"}, - {"myid": uid, "debug": True, "status": "RUNNING"}, + { + "myid": uid, + "debug": True, + "status": "SUBMITTED", + "task_id": str(uuid4()), + }, + { + "myid": uid, + "debug": True, + "status": "RUNNING", + "task_id": str(uuid4()), + }, ] self.doc_dao.insert_and_update_many("myid", docs) - docs = [{"myid": uid, "debug": True, "status": "FINISHED"}] + docs = [ + { + "myid": uid, + "debug": True, + "status": "FINISHED", + "task_id": str(uuid4()), + } + ] self.doc_dao.insert_and_update_many("myid", docs) self.doc_dao.delete_keys("myid", [uid]) c1 = self.doc_dao.count() diff --git a/tests/log_tests/log_test.py b/tests/log_tests/log_test.py index b5a514a5..27491141 100644 --- a/tests/log_tests/log_test.py +++ b/tests/log_tests/log_test.py @@ -1,7 +1,10 @@ +import logging import unittest +from asyncio import sleep import flowcept.commons from flowcept.commons.flowcept_logger import FlowceptLogger +from flowcept.configs import PROJECT_NAME class TestLog(unittest.TestCase): @@ -11,6 +14,7 @@ def test_log(self): _logger.debug("debug") _logger.info("info") _logger.error("info") + _logger.critical("aaaaa") raise Exception("I want to test an exception raise!") except Exception as e: _logger.exception(e) @@ -19,4 +23,9 @@ def test_log(self): _logger2 = flowcept.commons.logger # Testing singleton - assert id(_logger) == id(_logger2) == id(FlowceptLogger()) + assert ( + id(_logger) + == id(_logger2) + == id(FlowceptLogger()) + == id(logging.getLogger(PROJECT_NAME)) + ) diff --git a/tests/telemetry_test.py b/tests/telemetry_test.py index e0433ef5..0334a64d 100644 --- a/tests/telemetry_test.py +++ b/tests/telemetry_test.py @@ -1,5 +1,4 @@ import unittest -import json from flowcept.flowceptor.telemetry_capture import TelemetryCapture @@ -7,8 +6,6 @@ class TestTelemetry(unittest.TestCase): def test_telemetry(self): tele_capture = TelemetryCapture() - tele_capture.init_gpu_telemetry() telemetry = tele_capture.capture() assert telemetry.to_dict() - print(json.dumps(telemetry.to_dict(), indent=True)) tele_capture.shutdown_gpu_telemetry()