From 045489fd99bbfb38ef7f39853d9986a8b4809ff5 Mon Sep 17 00:00:00 2001 From: ricwo Date: Wed, 2 Jan 2019 14:00:03 +0100 Subject: [PATCH 1/4] add tf and sklearn version info --- CHANGELOG.rst | 1 + rasa_core/policies/ensemble.py | 31 +++++++++++++++++++++++-------- rasa_core/utils.py | 2 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 23bbd620c79..4c2cb6fd826 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -22,6 +22,7 @@ Added the intent right - Additional checks in PolicyEnsemble to ensure that custom Policy classes' load function returns the correct type +- Entries for tensorflow and sklearn versions to the policy metadata Removed ------- diff --git a/rasa_core/policies/ensemble.py b/rasa_core/policies/ensemble.py index eb9dc0317ed..78cde429b21 100644 --- a/rasa_core/policies/ensemble.py +++ b/rasa_core/policies/ensemble.py @@ -1,13 +1,13 @@ -import sys -from collections import defaultdict - import json import logging -import numpy as np import os +import sys +from collections import defaultdict from datetime import datetime from typing import Text, Optional, Any, List, Dict, Tuple +import numpy as np + import rasa_core from rasa_core import utils, training, constants from rasa_core.actions.action import ACTION_LISTEN_NAME @@ -17,9 +17,11 @@ from rasa_core.featurizers import MaxHistoryTrackerFeaturizer from rasa_core.policies import Policy from rasa_core.policies.fallback import FallbackPolicy +from rasa_core.policies.keras_policy import KerasPolicy from rasa_core.policies.memoization import ( MemoizationPolicy, AugmentedMemoizationPolicy) +from rasa_core.policies.sklearn_policy import SklearnPolicy from rasa_core.trackers import DialogueStateTracker logger = logging.getLogger(__name__) @@ -97,12 +99,22 @@ def _create_action_fingerprints(training_events): action_fingerprints[k] = {"slots": slots} return action_fingerprints + def _add_module_version_info(self, metadata: Dict[Text, Any]) -> None: + """Adds tensorflow and sklearn version info to metadata.""" + if any(isinstance(p, KerasPolicy) for p in self.policies): + import tensorflow as tf + metadata["tensorflow"] = tf.__version__ + + if any(isinstance(p, SklearnPolicy) for p in self.policies): + import sklearn + metadata["sklearn"] = sklearn.__version__ + def _persist_metadata(self, path: Text, dump_flattened_stories: bool = False) -> None: """Persists the domain specification to storage.""" - # make sure the directory we persist to exists + # make sure the directory we persist exists domain_spec_path = os.path.join(path, 'policy_metadata.json') training_data_path = os.path.join(path, 'stories.md') utils.create_dir_for_file(domain_spec_path) @@ -125,6 +137,8 @@ def _persist_metadata(self, "trained_at": self.date_trained } + self._add_module_version_info(metadata) + utils.dump_obj_as_json_to_file(domain_spec_path, metadata) # if there are lots of stories, saving flattened stories takes a long @@ -132,7 +146,8 @@ def _persist_metadata(self, if dump_flattened_stories: training.persist_data(self.training_trackers, training_data_path) - def persist(self, path: Text, dump_flattened_stories: bool = False) -> None: + def persist(self, path: Text, + dump_flattened_stories: bool = False) -> None: """Persists the policy to storage.""" self._persist_metadata(path, dump_flattened_stories) @@ -174,12 +189,12 @@ def _ensure_loaded_policy(cls, policy, policy_cls, policy_name: Text): raise Exception( "Failed to load policy {}: " "load returned None" - .format(policy_name)) + .format(policy_name)) elif not isinstance(policy, policy_cls): raise Exception( "Failed to load policy {}: " "load returned object that is not instance of its own class" - .format(policy_name)) + .format(policy_name)) @classmethod def load(cls, path: Text) -> 'PolicyEnsemble': diff --git a/rasa_core/utils.py b/rasa_core/utils.py index a4671c60b08..7de19c1dbb1 100644 --- a/rasa_core/utils.py +++ b/rasa_core/utils.py @@ -96,7 +96,7 @@ def class_from_module_path(module_path: Text) -> Any: def module_path_from_instance(inst: Any) -> Text: - """Return the module path of an instances class.""" + """Return the module path of an instance's class.""" return inst.__module__ + "." + inst.__class__.__name__ From b9987db9763ec0593ea3b158a2d59665d889bfa7 Mon Sep 17 00:00:00 2001 From: ricwo Date: Wed, 2 Jan 2019 14:02:32 +0100 Subject: [PATCH 2/4] format --- rasa_core/policies/ensemble.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rasa_core/policies/ensemble.py b/rasa_core/policies/ensemble.py index 78cde429b21..98048ee41de 100644 --- a/rasa_core/policies/ensemble.py +++ b/rasa_core/policies/ensemble.py @@ -188,13 +188,12 @@ def _ensure_loaded_policy(cls, policy, policy_cls, policy_name: Text): if policy is None: raise Exception( "Failed to load policy {}: " - "load returned None" - .format(policy_name)) + "load returned None".format(policy_name)) elif not isinstance(policy, policy_cls): raise Exception( "Failed to load policy {}: " "load returned object that is not instance of its own class" - .format(policy_name)) + "".format(policy_name)) @classmethod def load(cls, path: Text) -> 'PolicyEnsemble': From 6ec915dd97a65fa708d4f7afb0b589215cd9ab56 Mon Sep 17 00:00:00 2001 From: ricwo Date: Wed, 2 Jan 2019 14:36:25 +0100 Subject: [PATCH 3/4] generalised import --- rasa_core/policies/ensemble.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/rasa_core/policies/ensemble.py b/rasa_core/policies/ensemble.py index 98048ee41de..fe43fa61edd 100644 --- a/rasa_core/policies/ensemble.py +++ b/rasa_core/policies/ensemble.py @@ -1,3 +1,4 @@ +import importlib import json import logging import os @@ -17,17 +18,17 @@ from rasa_core.featurizers import MaxHistoryTrackerFeaturizer from rasa_core.policies import Policy from rasa_core.policies.fallback import FallbackPolicy -from rasa_core.policies.keras_policy import KerasPolicy from rasa_core.policies.memoization import ( MemoizationPolicy, AugmentedMemoizationPolicy) -from rasa_core.policies.sklearn_policy import SklearnPolicy from rasa_core.trackers import DialogueStateTracker logger = logging.getLogger(__name__) class PolicyEnsemble(object): + versioned_packages = ["rasa_core", "tensorflow", "sklearn"] + def __init__(self, policies: List[Policy], action_fingerprints: Optional[Dict] = None) -> None: @@ -99,15 +100,14 @@ def _create_action_fingerprints(training_events): action_fingerprints[k] = {"slots": slots} return action_fingerprints - def _add_module_version_info(self, metadata: Dict[Text, Any]) -> None: - """Adds tensorflow and sklearn version info to metadata.""" - if any(isinstance(p, KerasPolicy) for p in self.policies): - import tensorflow as tf - metadata["tensorflow"] = tf.__version__ - - if any(isinstance(p, SklearnPolicy) for p in self.policies): - import sklearn - metadata["sklearn"] = sklearn.__version__ + def _add_package_version_info(self, metadata: Dict[Text, Any]) -> None: + """Adds version info for self.versioned_packages to metadata.""" + for package_name in self.versioned_packages: + try: + p = importlib.import_module(package_name) + metadata[package_name] = p.__version__ + except ImportError: + pass def _persist_metadata(self, path: Text, @@ -129,7 +129,6 @@ def _persist_metadata(self, metadata = { "action_fingerprints": action_fingerprints, - "rasa_core": rasa_core.__version__, "python": ".".join([str(s) for s in sys.version_info[:3]]), "max_histories": self._max_histories(), "ensemble_name": self.__module__ + "." + self.__class__.__name__, @@ -137,7 +136,7 @@ def _persist_metadata(self, "trained_at": self.date_trained } - self._add_module_version_info(metadata) + self._add_package_version_info(metadata) utils.dump_obj_as_json_to_file(domain_spec_path, metadata) From 277c28bae6a9bf58bbbd9f0f11f66ef3a53786f7 Mon Sep 17 00:00:00 2001 From: Tom Bocklisch Date: Wed, 2 Jan 2019 15:00:35 +0100 Subject: [PATCH 4/4] Update rasa_core/policies/ensemble.py Co-Authored-By: ricwo --- rasa_core/policies/ensemble.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rasa_core/policies/ensemble.py b/rasa_core/policies/ensemble.py index fe43fa61edd..469de7c1617 100644 --- a/rasa_core/policies/ensemble.py +++ b/rasa_core/policies/ensemble.py @@ -102,6 +102,7 @@ def _create_action_fingerprints(training_events): def _add_package_version_info(self, metadata: Dict[Text, Any]) -> None: """Adds version info for self.versioned_packages to metadata.""" + for package_name in self.versioned_packages: try: p = importlib.import_module(package_name)