diff --git a/.yamato/com.unity.ml-agents-optional-dep-tests.yml b/.yamato/com.unity.ml-agents-optional-dep-tests.yml new file mode 100644 index 0000000000..2d04d731d9 --- /dev/null +++ b/.yamato/com.unity.ml-agents-optional-dep-tests.yml @@ -0,0 +1,37 @@ +OptionalDependencyTestsLinux: + name : LinuxOptionalDependenciesTests + agent: + type: Unity::VM + image: package-ci/ubuntu:stable + flavor: b1.medium + commands: + - | + curl -L https://artifactory.prd.it.unity3d.com/artifactory/api/gpg/key/public | sudo apt-key add - + sudo sh -c "echo 'deb https://artifactory.prd.it.unity3d.com/artifactory/unity-apt-local bionic main' > /etc/apt/sources.list.d/unity.list" + sudo apt update + sudo apt install -y unity-config + npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + unity-config settings editor-path ./.Editor + unity-config project create opt-deps-test + unity-config project add dependency com.unity.ml-agents/ + unity-config project add testable com.unity.ml-agents + unity-config project add dependency com.unity.modules.imageconversion@1.0.0 + unity-config project add dependency com.unity.modules.jsonserialize@1.0.0 + unity-config project add dependency com.unity.modules.physics@1.0.0 + unity-config project add dependency com.unity.modules.physics2d@1.0.0 + upm-ci project test -u 2019.4 --type project-tests --project-path opt-deps-test --package-filter com.unity.ml-agents + artifacts: + logs: + paths: + - "upm-ci~/test-results/**/*" + dependencies: + - .yamato/com.unity.ml-agents-pack.yml#pack + triggers: + cancel_old_ci: true + expression: | + (pull_request.target eq "main" OR + pull_request.target match "release.+") AND + NOT pull_request.draft AND + (pull_request.changes.any match "com.unity.ml-agents/**" OR + pull_request.changes.any match ".yamato/com.unity.ml-agents-test.yml") + diff --git a/.yamato/com.unity.ml-agents-test.yml b/.yamato/com.unity.ml-agents-test.yml index de6d12679a..94dd374481 100644 --- a/.yamato/com.unity.ml-agents-test.yml +++ b/.yamato/com.unity.ml-agents-test.yml @@ -149,3 +149,4 @@ test_{{ package.name }}_{{ platform.name }}_trunk: {% endfor %} {% endfor %} {% endfor %} + diff --git a/Project/Packages/manifest.json b/Project/Packages/manifest.json index caa9463d39..288cc289e5 100644 --- a/Project/Packages/manifest.json +++ b/Project/Packages/manifest.json @@ -1,12 +1,10 @@ { "dependencies": { "com.unity.ads": "2.0.8", - "com.unity.analytics": "3.2.3", "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.package-manager-ui": "2.0.13", - "com.unity.purchasing": "2.2.1", "com.unity.textmeshpro": "1.4.1", "com.unity.modules.ai": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index cf151d111b..1ac64b5658 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to ### Minor Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) - Updated com.unity.barracuda to 1.3.2-preview. (#5084) +- Make com.unity.modules.unityanalytics an optional dependency. (#5109) - Added 3D Ball to the `com.unity.ml-agents` samples. (#5077) #### ml-agents / ml-agents-envs / gym-unity (Python) - The `encoding_size` setting for RewardSignals has been deprecated. Please use `network_settings` instead. (#4982) diff --git a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs index c64906a25d..aa27bc151f 100644 --- a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs +++ b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs @@ -1,17 +1,29 @@ +#if MLA_UNITY_ANALYTICS_MODULE || !UNITY_2019_4_OR_NEWER +#define MLA_UNITY_ANALYTICS_MODULE_ENABLED +#endif + + using System; using System.Collections.Generic; +using System.Diagnostics; using Unity.Barracuda; using Unity.MLAgents.Actuators; using Unity.MLAgents.Inference; using Unity.MLAgents.Policies; using Unity.MLAgents.Sensors; using UnityEngine; + +#if MLA_UNITY_ANALYTICS_MODULE_ENABLED using UnityEngine.Analytics; +#endif + #if UNITY_EDITOR using UnityEditor; +#if MLA_UNITY_ANALYTICS_MODULE_ENABLED using UnityEditor.Analytics; -#endif +#endif // MLA_UNITY_ANALYTICS_MODULE_ENABLED +#endif // UNITY_EDITOR namespace Unity.MLAgents.Analytics @@ -50,16 +62,19 @@ static bool EnableAnalytics() return true; } -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED AnalyticsResult result = EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey, k_EventVersion); -#else + if (result == AnalyticsResult.Ok) + { + s_EventRegistered = true; + } +#elif MLA_UNITY_ANALYTICS_MODULE_ENABLED AnalyticsResult result = AnalyticsResult.UnsupportedPlatform; -#endif if (result == AnalyticsResult.Ok) { s_EventRegistered = true; } - +#endif if (s_EventRegistered && s_SentModels == null) { s_SentModels = new HashSet(); @@ -89,6 +104,7 @@ public static bool IsAnalyticsEnabled() /// ActionSpec for the Agent. Used to generate information about the action space. /// List of IActuators for the Agent. Used to generate information about the action space. /// + [Conditional("MLA_UNITY_ANALYTICS_MODULE_ENABLED")] public static void InferenceModelSet( NNModel nnModel, string behaviorName, @@ -117,7 +133,7 @@ IList actuators var data = GetEventForModel(nnModel, behaviorName, inferenceDevice, sensors, actionSpec, actuators); // Note - to debug, use JsonUtility.ToJson on the event. // Debug.Log(JsonUtility.ToJson(data, true)); -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED if (AnalyticsUtils.s_SendEditorAnalytics) { EditorAnalytics.SendEventWithLimit(k_EventName, data, k_EventVersion); diff --git a/com.unity.ml-agents/Runtime/Analytics/TrainingAnalytics.cs b/com.unity.ml-agents/Runtime/Analytics/TrainingAnalytics.cs index fa24f6c67c..faa26cfca5 100644 --- a/com.unity.ml-agents/Runtime/Analytics/TrainingAnalytics.cs +++ b/com.unity.ml-agents/Runtime/Analytics/TrainingAnalytics.cs @@ -1,13 +1,22 @@ +#if MLA_UNITY_ANALYTICS_MODULE || !UNITY_2019_4_OR_NEWER +#define MLA_UNITY_ANALYTICS_MODULE_ENABLED +#endif + using System; using System.Collections.Generic; +using System.Diagnostics; using Unity.MLAgents.Actuators; using Unity.MLAgents.Sensors; using UnityEngine; +#if MLA_UNITY_ANALYTICS_MODULE_ENABLED using UnityEngine.Analytics; +#if UNITY_EDITOR +using UnityEditor.Analytics; +#endif +#endif #if UNITY_EDITOR using UnityEditor; -using UnityEditor.Analytics; #endif namespace Unity.MLAgents.Analytics @@ -56,22 +65,22 @@ internal class TrainingAnalytics static bool EnableAnalytics() { +#if MLA_UNITY_ANALYTICS_MODULE_ENABLED if (s_EventsRegistered) { return true; } - foreach (var eventName in s_EventNames) { #if UNITY_EDITOR AnalyticsResult result = EditorAnalytics.RegisterEventWithLimit(eventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey); -#else - AnalyticsResult result = AnalyticsResult.UnsupportedPlatform; -#endif if (result != AnalyticsResult.Ok) { return false; } +#else + return false; +#endif // UNITY_EDITOR } s_EventsRegistered = true; @@ -83,6 +92,9 @@ static bool EnableAnalytics() } return s_EventsRegistered; +#else + return false; +#endif // MLA_UNITY_ANALYTICS_MODULE_ENABLED } /// @@ -90,6 +102,7 @@ static bool EnableAnalytics() /// /// /// + [Conditional("MLA_UNITY_ANALYTICS_MODULE_ENABLED")] public static void SetTrainerInformation(string packageVersion, string communicationVersion) { s_TrainerPackageVersion = packageVersion; @@ -98,13 +111,14 @@ public static void SetTrainerInformation(string packageVersion, string communica public static bool IsAnalyticsEnabled() { -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED return EditorAnalytics.enabled; #else return false; #endif } + [Conditional("MLA_UNITY_ANALYTICS_MODULE_ENABLED")] public static void TrainingEnvironmentInitialized(TrainingEnvironmentInitializedEvent tbiEvent) { if (!IsAnalyticsEnabled()) @@ -126,16 +140,15 @@ public static void TrainingEnvironmentInitialized(TrainingEnvironmentInitialized // Debug.Log( // $"Would send event {k_TrainingEnvironmentInitializedEventName} with body {JsonUtility.ToJson(tbiEvent, true)}" // ); -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED if (AnalyticsUtils.s_SendEditorAnalytics) { EditorAnalytics.SendEventWithLimit(k_TrainingEnvironmentInitializedEventName, tbiEvent); } -#else - return; #endif } + [Conditional("MLA_UNITY_ANALYTICS_MODULE_ENABLED")] public static void RemotePolicyInitialized( string fullyQualifiedBehaviorName, IList sensors, @@ -164,13 +177,11 @@ IList actuators // Debug.Log( // $"Would send event {k_RemotePolicyInitializedEventName} with body {JsonUtility.ToJson(data, true)}" // ); -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED if (AnalyticsUtils.s_SendEditorAnalytics) { EditorAnalytics.SendEventWithLimit(k_RemotePolicyInitializedEventName, data); } -#else - return; #endif } @@ -186,6 +197,7 @@ internal static string ParseBehaviorName(string fullyQualifiedBehaviorName) return fullyQualifiedBehaviorName.Substring(0, lastQuestionIndex); } + [Conditional("MLA_UNITY_ANALYTICS_MODULE_ENABLED")] public static void TrainingBehaviorInitialized(TrainingBehaviorInitializedEvent tbiEvent) { if (!IsAnalyticsEnabled()) @@ -211,7 +223,7 @@ public static void TrainingBehaviorInitialized(TrainingBehaviorInitializedEvent // Debug.Log( // $"Would send event {k_TrainingBehaviorInitializedEventName} with body {JsonUtility.ToJson(tbiEvent, true)}" // ); -#if UNITY_EDITOR +#if UNITY_EDITOR && MLA_UNITY_ANALYTICS_MODULE_ENABLED if (AnalyticsUtils.s_SendEditorAnalytics) { EditorAnalytics.SendEventWithLimit(k_TrainingBehaviorInitializedEventName, tbiEvent); diff --git a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs index b5d8a85632..dfce6cded5 100644 --- a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs +++ b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs @@ -6,11 +6,11 @@ using UnityEngine; using System.Runtime.CompilerServices; using Unity.MLAgents.Actuators; -using Unity.MLAgents.Analytics; using Unity.MLAgents.Sensors; using Unity.MLAgents.Demonstrations; using Unity.MLAgents.Policies; +using Unity.MLAgents.Analytics; [assembly: InternalsVisibleTo("Unity.ML-Agents.Editor")] [assembly: InternalsVisibleTo("Unity.ML-Agents.Editor.Tests")] @@ -525,7 +525,6 @@ internal static bool IsTrivialMapping(ISensor sensor) } #region Analytics - internal static TrainingEnvironmentInitializedEvent ToTrainingEnvironmentInitializedEvent( this TrainingEnvironmentInitialized inputProto) { @@ -569,7 +568,6 @@ internal static TrainingBehaviorInitializedEvent ToTrainingBehaviorInitializedEv NumNetworkHiddenUnits = inputProto.NumNetworkHiddenUnits, }; } - #endregion } diff --git a/com.unity.ml-agents/Runtime/Communicator/RpcCommunicator.cs b/com.unity.ml-agents/Runtime/Communicator/RpcCommunicator.cs index 221f94e641..2ae635efd8 100644 --- a/com.unity.ml-agents/Runtime/Communicator/RpcCommunicator.cs +++ b/com.unity.ml-agents/Runtime/Communicator/RpcCommunicator.cs @@ -12,12 +12,13 @@ using System.Linq; using UnityEngine; using Unity.MLAgents.Actuators; -using Unity.MLAgents.Analytics; using Unity.MLAgents.CommunicatorObjects; using Unity.MLAgents.Sensors; using Unity.MLAgents.SideChannels; using Google.Protobuf; +using Unity.MLAgents.Analytics; + namespace Unity.MLAgents { /// Responsible for communication with External using gRPC. @@ -144,7 +145,6 @@ out input var pythonPackageVersion = initializationInput.RlInitializationInput.PackageVersion; var pythonCommunicationVersion = initializationInput.RlInitializationInput.CommunicationVersion; - TrainingAnalytics.SetTrainerInformation(pythonPackageVersion, pythonCommunicationVersion); var communicationIsCompatible = CheckCommunicationVersionsAreCompatible( diff --git a/com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs b/com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs index fda19afcc8..e138590d97 100644 --- a/com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs +++ b/com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs @@ -1,7 +1,8 @@ + using System.Collections.Generic; using Unity.MLAgents.Actuators; -using Unity.MLAgents.Analytics; using Unity.MLAgents.Sensors; +using Unity.MLAgents.Analytics; namespace Unity.MLAgents.Policies diff --git a/com.unity.ml-agents/Runtime/Unity.ML-Agents.asmdef b/com.unity.ml-agents/Runtime/Unity.ML-Agents.asmdef index 3086da3ac4..90e7e3fae6 100755 --- a/com.unity.ml-agents/Runtime/Unity.ML-Agents.asmdef +++ b/com.unity.ml-agents/Runtime/Unity.ML-Agents.asmdef @@ -15,5 +15,12 @@ "Grpc.Core.dll" ], "autoReferenced": true, - "defineConstraints": [] + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.modules.unityanalytics", + "expression": "1.0.0", + "define": "MLA_UNITY_ANALYTICS_MODULE" + } + ] } diff --git a/com.unity.ml-agents/Tests/Editor/Analytics/InferenceAnalyticsTests.cs b/com.unity.ml-agents/Tests/Editor/Analytics/InferenceAnalyticsTests.cs index 3e53f15465..c4516d9b7b 100644 --- a/com.unity.ml-agents/Tests/Editor/Analytics/InferenceAnalyticsTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Analytics/InferenceAnalyticsTests.cs @@ -5,10 +5,11 @@ using UnityEngine; using Unity.Barracuda; using Unity.MLAgents.Actuators; -using Unity.MLAgents.Analytics; using Unity.MLAgents.Policies; +using Unity.MLAgents.Analytics; using UnityEditor; + namespace Unity.MLAgents.Tests.Analytics { [TestFixture] diff --git a/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs b/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs index 2529ecd96f..2df9e41d52 100644 --- a/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs @@ -1,11 +1,12 @@ using NUnit.Framework; using Unity.MLAgents.Actuators; -using Unity.MLAgents.Analytics; -using Unity.MLAgents.CommunicatorObjects; using Unity.MLAgents.Demonstrations; using Unity.MLAgents.Policies; using Unity.MLAgents.Sensors; +using Unity.MLAgents.Analytics; +using Unity.MLAgents.CommunicatorObjects; + namespace Unity.MLAgents.Tests { [TestFixture] @@ -171,7 +172,6 @@ public void TestIsTrivialMapping() sparseChannelSensor.Mapping = new[] { 0, 0, 0, 1, 1, 1 }; Assert.AreEqual(GrpcExtensions.IsTrivialMapping(sparseChannelSensor), false); } - [Test] public void TestDefaultTrainingEvents() { diff --git a/com.unity.ml-agents/Tests/Editor/Unity.ML-Agents.Editor.Tests.asmdef b/com.unity.ml-agents/Tests/Editor/Unity.ML-Agents.Editor.Tests.asmdef index 6035c9b3e0..347220f54e 100755 --- a/com.unity.ml-agents/Tests/Editor/Unity.ML-Agents.Editor.Tests.asmdef +++ b/com.unity.ml-agents/Tests/Editor/Unity.ML-Agents.Editor.Tests.asmdef @@ -23,5 +23,12 @@ "autoReferenced": false, "defineConstraints": [ "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [ + { + "name": "com.unity.modules.unityanalytics", + "expression": "1.0.0", + "define": "MLA_UNITY_ANALYTICS_MODULE" + } ] } diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index 8a07e67992..700753daa1 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -9,7 +9,6 @@ "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0" + "com.unity.modules.physics2d": "1.0.0" } }