From 00f2c3138f9907235c6f622a144acfdfa176e359 Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Thu, 9 Jul 2020 09:42:35 -0700 Subject: [PATCH 1/2] don't allow --num-envs >1 with no --env (#4203) * don't allow --num-envs >1 with no --env * changelog * PR feedback --- com.unity.ml-agents/CHANGELOG.md | 2 ++ ml-agents/mlagents/trainers/settings.py | 7 ++++++- .../mlagents/trainers/tests/test_settings.py | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 3291d0b1b3..a53e1fcf55 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to ### Minor Changes ### Bug Fixes +`mlagents-learn` will now raise an error immediately if `--num-envs` is greater than 1 without setting the `--env` +argument. (#4203) ## [1.2.0-preview] - 2020-07-15 diff --git a/ml-agents/mlagents/trainers/settings.py b/ml-agents/mlagents/trainers/settings.py index 55ee9b0b63..9b75496ffc 100644 --- a/ml-agents/mlagents/trainers/settings.py +++ b/ml-agents/mlagents/trainers/settings.py @@ -600,9 +600,14 @@ class EnvironmentSettings: env_path: Optional[str] = parser.get_default("env_path") env_args: Optional[List[str]] = parser.get_default("env_args") base_port: int = parser.get_default("base_port") - num_envs: int = parser.get_default("num_envs") + num_envs: int = attr.ib(default=parser.get_default("num_envs")) seed: int = parser.get_default("seed") + @num_envs.validator + def validate_num_envs(self, attribute, value): + if value > 1 and self.env_path is None: + raise ValueError("num_envs must be 1 if env_path is not set.") + @attr.s(auto_attribs=True) class EngineSettings: diff --git a/ml-agents/mlagents/trainers/tests/test_settings.py b/ml-agents/mlagents/trainers/tests/test_settings.py index be93042396..2a9393c1b3 100644 --- a/ml-agents/mlagents/trainers/tests/test_settings.py +++ b/ml-agents/mlagents/trainers/tests/test_settings.py @@ -13,6 +13,7 @@ RewardSignalType, RewardSignalSettings, CuriositySettings, + EnvironmentSettings, EnvironmentParameterSettings, ConstantSettings, UniformSettings, @@ -452,3 +453,18 @@ def test_exportable_settings(use_defaults): check_dict_is_at_least(second_export, dict_export) # Check that the two exports are the same assert dict_export == second_export + + +def test_environment_settings(): + # default args + EnvironmentSettings() + + # 1 env is OK if no env_path + EnvironmentSettings(num_envs=1) + + # multiple envs is OK if env_path is set + EnvironmentSettings(num_envs=42, env_path="/foo/bar.exe") + + # Multiple environments with no env_path is an error + with pytest.raises(ValueError): + EnvironmentSettings(num_envs=2) From eea687fdeefddf5f52c7300f0705a3574fb7883d Mon Sep 17 00:00:00 2001 From: Chris Elion Date: Thu, 9 Jul 2020 13:08:25 -0700 Subject: [PATCH 2/2] update changelog --- DevProject/Packages/manifest.json | 1 + .../SharedAssets/Scripts/ModelOverrider.cs | 42 ++++++++++++++----- Project/Packages/manifest.json | 1 + com.unity.ml-agents/CHANGELOG.md | 4 +- com.unity.ml-agents/package.json | 2 +- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/DevProject/Packages/manifest.json b/DevProject/Packages/manifest.json index 9c18a115e4..7c63d13e9a 100644 --- a/DevProject/Packages/manifest.json +++ b/DevProject/Packages/manifest.json @@ -10,6 +10,7 @@ "com.unity.ide.vscode": "1.1.4", "com.unity.ml-agents": "file:../../com.unity.ml-agents", "com.unity.ml-agents.extensions": "file:../../com.unity.ml-agents.extensions", + "com.unity.barracuda": "file:../../../UnityInferenceEngine/UnityProject/Assets/Barracuda", "com.unity.multiplayer-hlapi": "1.0.6", "com.unity.package-manager-doctools": "1.1.1-preview.3", "com.unity.package-validation-suite": "0.11.0-preview", diff --git a/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs b/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs index b8727ba956..31ac63d5cd 100644 --- a/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs +++ b/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs @@ -3,6 +3,7 @@ using UnityEngine; using Unity.Barracuda; using System.IO; +using Unity.Barracuda.ONNX; using Unity.MLAgents; using Unity.MLAgents.Policies; #if UNITY_EDITOR @@ -113,9 +114,7 @@ void GetAssetPathFromCommandLine() { m_OverrideExtension = args[i + 1].Trim().ToLower(); var isKnownExtension = k_SupportedExtensions.Contains(m_OverrideExtension); - // Not supported yet - need to update the model loading code to support - var isOnnx = m_OverrideExtension.Equals("onnx"); - if (!isKnownExtension || isOnnx) + if (!isKnownExtension) { Debug.LogError($"loading unsupported format: {m_OverrideExtension}"); Application.Quit(1); @@ -209,10 +208,10 @@ public NNModel GetModelForBehaviorName(string behaviorName) return null; } - byte[] model = null; + byte[] rawModel = null; try { - model = File.ReadAllBytes(assetPath); + rawModel = File.ReadAllBytes(assetPath); } catch(IOException) { @@ -222,11 +221,34 @@ public NNModel GetModelForBehaviorName(string behaviorName) return null; } - // Note - this approach doesn't work for onnx files. Need to replace with - // the equivalent of ONNXModelImporter.OnImportAsset() - var asset = ScriptableObject.CreateInstance(); - asset.modelData = ScriptableObject.CreateInstance(); - asset.modelData.Value = model; + NNModel asset; + var isOnnx = m_OverrideExtension.Equals("onnx"); + if (isOnnx) + { + var importer = new ONNXModelImporterRuntime(true); + var onnxModel = importer.Import(rawModel); + + NNModelData assetData = ScriptableObject.CreateInstance(); + using (var memoryStream = new MemoryStream()) + using (var writer = new BinaryWriter(memoryStream)) + { + ModelWriter.Save(writer, onnxModel); + assetData.Value = memoryStream.ToArray(); + } + assetData.name = "Data"; + assetData.hideFlags = HideFlags.HideInHierarchy; + + asset = ScriptableObject.CreateInstance(); + asset.modelData = assetData; + } + else + { + // Note - this approach doesn't work for onnx files. Need to replace with + // the equivalent of ONNXModelImporter.OnImportAsset() + asset = ScriptableObject.CreateInstance(); + asset.modelData = ScriptableObject.CreateInstance(); + asset.modelData.Value = rawModel; + } asset.name = "Override - " + Path.GetFileName(assetPath); m_CachedModels[behaviorName] = asset; diff --git a/Project/Packages/manifest.json b/Project/Packages/manifest.json index 52a719d5e6..036f38ae3a 100644 --- a/Project/Packages/manifest.json +++ b/Project/Packages/manifest.json @@ -5,6 +5,7 @@ "com.unity.collab-proxy": "1.2.15", "com.unity.ml-agents": "file:../../com.unity.ml-agents", "com.unity.ml-agents.extensions": "file:../../com.unity.ml-agents.extensions", + "com.unity.barracuda": "file:../../../UnityInferenceEngine/UnityProject/Assets/Barracuda", "com.unity.package-manager-ui": "2.0.8", "com.unity.purchasing": "2.0.3", "com.unity.textmeshpro": "1.4.1", diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index a53e1fcf55..9d458420d7 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -13,8 +13,6 @@ and this project adheres to ### Minor Changes ### Bug Fixes -`mlagents-learn` will now raise an error immediately if `--num-envs` is greater than 1 without setting the `--env` -argument. (#4203) ## [1.2.0-preview] - 2020-07-15 @@ -47,6 +45,8 @@ empty string). (#4155) - Fixed issue with FoodCollector, Soccer, and WallJump when playing with keyboard. (#4147, #4174) - Fixed a crash in StatsReporter when using threaded trainers with very frequent summary writes (#4201) +- `mlagents-learn` will now raise an error immediately if `--num-envs` is greater than 1 without setting the `--env` +argument. (#4203) ## [1.1.0-preview] - 2020-06-10 ### Major Changes diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index 3a0cd7940a..00b07b3fb9 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -5,6 +5,6 @@ "unity": "2018.4", "description": "Use state-of-the-art machine learning to create intelligent character behaviors in any Unity environment (games, robotics, film, etc.).", "dependencies": { - "com.unity.barracuda": "1.0.1" + "com.unity.barracuda": "1.1.0-preview" } }