コード例 #1
0
        public ActionResult Validate()
        {
            try
            {
                APIUtil.Authenticate(this.Request);

                if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now)
                {
                    var url = APIUtil.GetSettingsUrl();
                    this.metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(url);
                    lastDownload  = DateTime.Now;
                }

                var context = APIUtil.ReadBody(this.Request);
                using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments)
                {
                    EnableStringExampleGeneration = true,
                    EnableStringFloatCompact = true
                }))
                    using (var serializer = new VowpalWabbitJsonSerializer(vw))
                        using (var example = serializer.ParseAndCreate(context))
                        {
                            return(Json(new { VWExample = example.VowpalWabbitString }));
                        }
            }
            catch (UnauthorizedAccessException ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.Unauthorized, ex.Message));
            }
            catch (Exception ex)
            {
                new TelemetryClient().TrackException(ex);
                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError, ex.ToString()));
            }
        }
コード例 #2
0
ファイル: HomeController.cs プロジェクト: jiajli/mwt-ds
        private CollectiveSettingsView CreateCollectiveSettings(ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata, string uniqueStringInUrl)
        {
            var svm = new CollectiveSettingsView
            {
                AzureSubscriptionId                   = extraMetadata.SubscriptionId,
                DecisionType                          = extraMetadata.DecisionType == DecisionType.SingleAction ? DecisionDisplayType.No : DecisionDisplayType.Yes,
                TrainArguments                        = clientMetadata.TrainArguments,
                AzureStorageConnectionString          = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString],
                AzureResourceGroupName                = extraMetadata.AzureResourceGroupName,
                ApplicationInsightsInstrumentationKey = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKAppInsightsKey],
                OnlineTrainerAddress                  = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKTrainerURL],
                WebApiAddress                         = $"https://{extraMetadata.AzureResourceGroupName}-webapi-{uniqueStringInUrl}.azurewebsites.net",
                ASAEvalName = extraMetadata.AzureResourceGroupName + "-eval",
                ASAJoinName = extraMetadata.AzureResourceGroupName + "-join",
                EventHubInteractionConnectionString = clientMetadata.EventHubInteractionConnectionString,
                EventHubObservationConnectionString = clientMetadata.EventHubObservationConnectionString,
                ExperimentalUnitDuration            = extraMetadata.ExperimentalUnitDuration,
                SelectedModelId = new SettingBlobListViewModel
                {
                    Items = new List <BlobModelViewModel>()
                    {
                        new BlobModelViewModel
                        {
                            Name = ApplicationSettingConstants.UseLatestModelSetting
                        }
                    },
                    SelectedItem = extraMetadata.ModelId
                },
                IsExplorationEnabled      = clientMetadata.IsExplorationEnabled,
                InitialExplorationEpsilon = clientMetadata.InitialExplorationEpsilon,
                SettingsBlobUri           = extraMetadata.SettingsTokenUri1
            };

            return(svm);
        }
コード例 #3
0
        public async Task<HttpResponseMessage> Post()
        {
            var header = this.Request.Headers.SingleOrDefault(x => x.Key == "Authorization");

            if (header.Value == null)
                throw new UnauthorizedAccessException("AuthorizationToken missing");

            var userToken = header.Value.First();

            if (string.IsNullOrWhiteSpace(userToken) || userToken != ConfigurationManager.AppSettings["UserToken"])
                return Request.CreateResponse(HttpStatusCode.Unauthorized);

            if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now)
            {
                var url = ConfigurationManager.AppSettings["DecisionServiceSettingsUrl"];
                this.metaData = ApplicationMetadataUtil.DownloadMetadata<ApplicationClientMetadata>(url);
                lastDownload = DateTime.Now;
            }

            using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments)
            {
                EnableStringExampleGeneration = true,
                EnableStringFloatCompact = true
            }))
            using (var serializer = new VowpalWabbitJsonSerializer(vw))
            using (var example = serializer.ParseAndCreate(new JsonTextReader(new StreamReader(await Request.Content.ReadAsStreamAsync()))))
            {
                return Request.CreateResponse(HttpStatusCode.OK, example.VowpalWabbitString);
            }
        }
コード例 #4
0
        public async Task <HttpResponseMessage> Post()
        {
            var header = this.Request.Headers.SingleOrDefault(x => x.Key == "Authorization");

            if (header.Value == null)
            {
                throw new UnauthorizedAccessException("AuthorizationToken missing");
            }

            var userToken = header.Value.First();

            if (string.IsNullOrWhiteSpace(userToken) || userToken != ConfigurationManager.AppSettings["UserToken"])
            {
                return(Request.CreateResponse(HttpStatusCode.Unauthorized));
            }

            if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now)
            {
                var url = ConfigurationManager.AppSettings["DecisionServiceSettingsUrl"];
                this.metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(url);
                lastDownload  = DateTime.Now;
            }

            using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments)
            {
                EnableStringExampleGeneration = true,
                EnableStringFloatCompact = true
            }))
                using (var serializer = new VowpalWabbitJsonSerializer(vw))
                    using (var example = serializer.ParseAndCreate(new JsonTextReader(new StreamReader(await Request.Content.ReadAsStreamAsync()))))
                    {
                        return(Request.CreateResponse(HttpStatusCode.OK, example.VowpalWabbitString));
                    }
        }
コード例 #5
0
        public async Task UpdateSettings(string trainArguments = null, float?initialExplorationEpsilon = null, bool?isExplorationEnabled = null)
        {
            var token = Request.Headers["auth"];

            if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword])
            {
                throw new UnauthorizedAccessException();
            }

            var telemetry = new TelemetryClient();

            try
            {
                telemetry.TrackTrace($"UpdateSettings(trainArguments={trainArguments}, initialExplorationEpsilon={initialExplorationEpsilon}, isExplorationEnabled={isExplorationEnabled})");

                string azureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString];
                var    storageAccount        = CloudStorageAccount.Parse(azureStorageConnectionString);
                var    blobClient            = storageAccount.CreateCloudBlobClient();
                var    settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName);

                var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName);
                ApplicationClientMetadata clientMeta;
                if (await blob.ExistsAsync())
                {
                    clientMeta = JsonConvert.DeserializeObject <ApplicationClientMetadata>(await blob.DownloadTextAsync());
                }
                else
                {
                    clientMeta = new ApplicationClientMetadata();
                }

                if (trainArguments != null)
                {
                    clientMeta.TrainArguments = trainArguments;
                }

                if (initialExplorationEpsilon != null)
                {
                    clientMeta.InitialExplorationEpsilon = (float)initialExplorationEpsilon;
                }

                if (isExplorationEnabled != null)
                {
                    clientMeta.IsExplorationEnabled = (bool)isExplorationEnabled;
                }

                await blob.UploadTextAsync(JsonConvert.SerializeObject(clientMeta));
            }
            catch (Exception e)
            {
                telemetry.TrackException(e);
            }
        }
コード例 #6
0
        public byte[] GetSettingsBlobContent(string vwArgs, float initialExplorationEpsilon)
        {
            var metadata = new ApplicationClientMetadata
            {
                ApplicationID             = TestAppID,
                IsExplorationEnabled      = true,
                ModelBlobUri              = this.localAzureModelBlobUri,
                InitialExplorationEpsilon = initialExplorationEpsilon,
                TrainArguments            = vwArgs
            };

            return(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(metadata)));
        }
コード例 #7
0
ファイル: HomeController.cs プロジェクト: jiajli/mwt-ds
        private List <SettingItemViewModel> SettingsView()
        {
            var clientSettingsBlob = (CloudBlockBlob)Session[SKClientSettingsBlob];
            ApplicationClientMetadata clientApp = JsonConvert.DeserializeObject <ApplicationClientMetadata>(clientSettingsBlob.DownloadText());

            Session[SKClientSettings] = clientApp;

            var extraSettingsBlob             = (CloudBlockBlob)Session[SKExtraSettingsBlob];
            ApplicationExtraMetadata extraApp = JsonConvert.DeserializeObject <ApplicationExtraMetadata>(extraSettingsBlob.DownloadText());

            Session[SKExtraSettings] = extraApp;

            return(CreateAppView(clientApp, extraApp));
        }
コード例 #8
0
        public void TestSingleActionOfflineModeCustomLogger()
        {
            var dsConfig = new DecisionServiceConfiguration("")
            {
                OfflineMode = true, OfflineApplicationID = ""
            };

            var metaData = new ApplicationClientMetadata
            {
                TrainArguments            = "--cb_explore_adf --epsilon 0.3",
                InitialExplorationEpsilon = 1f
            };

            var recorder        = new TestLogger();
            int numChooseAction = 100;

            using (var ds = DecisionService.Create <TestContext>(dsConfig, metaData: metaData)
                            .WithRecorder(recorder)
                            .ExploitUntilModelReady(new ConstantPolicy <TestContext>()))
            {
                for (int i = 0; i < numChooseAction; i++)
                {
                    ds.ChooseAction(i.ToString(), new TestContext());
                }

                Assert.AreEqual(numChooseAction, recorder.NumRecord);

                int numReward = 200;
                for (int i = 0; i < numReward; i++)
                {
                    ds.ReportReward(i, i.ToString());
                }

                Assert.AreEqual(numReward, recorder.NumReward);

                int numOutcome = 300;
                for (int i = 0; i < numOutcome; i++)
                {
                    ds.ReportOutcome(i.ToString(), i.ToString());
                }

                Assert.AreEqual(numOutcome, recorder.NumOutcome);
            }

            Assert.AreEqual(0, recorder.NumRecord);
            Assert.AreEqual(0, recorder.NumReward);
            Assert.AreEqual(0, recorder.NumOutcome);
        }
コード例 #9
0
        public async Task <ActionResult> Offline(string startTimeInclusive, string endTimeExclusive, string dataFormat = "json")
        {
            var token = Request.Headers["auth"];

            if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword])
            {
                throw new UnauthorizedAccessException();
            }

            var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString]);

            var blobClient = storageAccount.CreateCloudBlobClient();

            StreamWriter responseWriter = null;

            switch (dataFormat)
            {
            case "json":
                responseWriter = new StreamWriter(Response.OutputStream, Encoding.UTF8);
                break;

            case "vw":
                var settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName);
                var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName);
                if (!await blob.ExistsAsync())
                {
                    return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "Application settings blob not found."));
                }
                ApplicationClientMetadata clientMeta = JsonConvert.DeserializeObject <ApplicationClientMetadata>(await blob.DownloadTextAsync());
                responseWriter = new VowpalWabbitStreamWriter(Response.OutputStream, Encoding.UTF8, clientMeta.TrainArguments);
                break;

            default:
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Unrecognized data format."));
            }

            using (responseWriter)
            {
                await AzureBlobDownloader.Download(
                    storageAccount,
                    DateTime.ParseExact(startTimeInclusive, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture),
                    DateTime.ParseExact(endTimeExclusive, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture),
                    responseWriter).ConfigureAwait(false);
            }

            return(new HttpStatusCodeResult(HttpStatusCode.OK));
        }
コード例 #10
0
        public void TestMultiActionOfflineModeArgument()
        {
            var metaData = new ApplicationClientMetadata
            {
                TrainArguments            = "--cb_explore_adf --epsilon 0.3",
                InitialExplorationEpsilon = 1f
            };

            using (var ds = DecisionService.CreateJson(
                       new DecisionServiceConfiguration("")
            {
                OfflineMode = true, OfflineApplicationID = ""
            },
                       metaData))
            {
                ds.ChooseAction("", "{}");
            }
        }
コード例 #11
0
        public async Task InitialFullExplorationTest()
        {
            var recorder = new MyRecorder();

            using (var model = new MemoryStream())
            {
                using (var vw = new VowpalWabbit("--cb_explore_adf --epsilon 0.3"))
                {
                    vw.Learn(new[] { "1:-3:0.2 | b:2" });
                    vw.ID = "123";
                    vw.SaveModel(model);
                }

                var config = new DecisionServiceConfiguration("")
                {
                    OfflineMode = true, OfflineApplicationID = "", DevelopmentMode = true
                };
                var metaData = new ApplicationClientMetadata
                {
                    TrainArguments            = "--cb_explore_adf --epsilon 0.3",
                    InitialExplorationEpsilon = 1f
                };

                using (var ds = DecisionService.CreateJson(config, metaData: metaData).WithRecorder(recorder))
                {
                    var decision = await ds.ChooseRankingAsync("abc", "{\"a\":1,\"_multi\":[{\"b\":2}]}");

                    // since there's not a model loaded why should get 100% exploration
                    // Assert.AreEqual(1f, recorder.LastExplorerState.Probability);

                    model.Position = 0;
                    ds.UpdateModel(model);

                    decision = await ds.ChooseRankingAsync("abc", "{\"a\":1,\"_multi\":[{\"b\":2}, {\"b\":3}]}");

                    // Assert.AreNotEqual(1f, recorder.LastExplorerState.Probability);

                    var vwState = recorder.LastMapperState as VWState;
                    Assert.IsNotNull(vwState);
                    Assert.AreEqual("123", vwState.ModelId);
                }
            }
        }
コード例 #12
0
        public async Task UpdateSettings(string trainArguments = null, float? initialExplorationEpsilon = null, bool? isExplorationEnabled = null)
        {
            var token = Request.Headers["Authorization"];
            if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword])
                throw new UnauthorizedAccessException();

            var telemetry = new TelemetryClient();
            try
            {
                telemetry.TrackTrace($"UpdateSettings(trainArguments={trainArguments}, initialExplorationEpsilon={initialExplorationEpsilon}, isExplorationEnabled={isExplorationEnabled})");

                string azureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString];
                var storageAccount = CloudStorageAccount.Parse(azureStorageConnectionString);
                var blobClient = storageAccount.CreateCloudBlobClient();
                var settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName);

                var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName);
                ApplicationClientMetadata clientMeta;
                if (await blob.ExistsAsync())
                    clientMeta = JsonConvert.DeserializeObject<ApplicationClientMetadata>(await blob.DownloadTextAsync());
                else
                    clientMeta = new ApplicationClientMetadata();

                if (trainArguments != null)
                    clientMeta.TrainArguments = trainArguments;

                if (initialExplorationEpsilon != null)
                    clientMeta.InitialExplorationEpsilon = (float)initialExplorationEpsilon;

                if (isExplorationEnabled != null)
                    clientMeta.IsExplorationEnabled = (bool)isExplorationEnabled;

                await blob.UploadTextAsync(JsonConvert.SerializeObject(clientMeta));
            }
            catch (Exception e)
            {
                telemetry.TrackException(e);
            }
        }
コード例 #13
0
        public void TestSingleActionOfflineModeArgument()
        {
            var dsConfig = new DecisionServiceConfiguration("")
            {
                OfflineMode = true, OfflineApplicationID = ""
            };

            try
            {
                var metaData = new ApplicationClientMetadata
                {
                    TrainArguments            = "--cb_explore_adf --epsilon 0.3",
                    InitialExplorationEpsilon = 1f
                };
                using (var ds = DecisionService.Create <TestContext>(dsConfig, metaData: metaData))
                { }
            }
            catch (ArgumentException ex)
            {
                Assert.AreEqual("Recorder", ex.ParamName);
            }
        }
コード例 #14
0
ファイル: HomeController.cs プロジェクト: jiajli/mwt-ds
        private List <SettingItemViewModel> CreateAppView(
            ApplicationClientMetadata clientMetadata,
            ApplicationExtraMetadata extraMetadata)
        {
            string uniqueStringInUrl = Regex.Match(Request.Url.ToString(), ".*mc-(.*).azurewebsites.*").Groups[1].Value;

            CollectiveSettingsView svm = CreateCollectiveSettings(clientMetadata, extraMetadata, uniqueStringInUrl);

            string azureStorageName = Regex.Match(svm.AzureStorageConnectionString, ".*AccountName=(.*);AccountKey.*").Groups[1].Value;

            var nameToValue = svm.GetType().GetProperties()
                              .Select(p => new { Name = p.Name, Value = p.GetValue(svm) });

            var nameToHelpText = typeof(HelpText).GetProperties()
                                 .Where(p => p.PropertyType == typeof(string))
                                 .Select(p => new { HelpText = ((string)p.GetValue(null)).Split(new string[] { " ::: " }, StringSplitOptions.RemoveEmptyEntries).ToList(), Name = p.Name });

            var nameToUrl = new[]
            {
                new { Name = nameof(svm.AzureResourceGroupName), Tooltip = "View Azure Resource Group", Url = $"https://ms.portal.azure.com/#asset/HubsExtension/ResourceGroups/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}" },
                new { Name = nameof(svm.AzureStorageConnectionString), Tooltip = "View Data", Url = $"https://ms.portal.azure.com/#blade/Microsoft_Azure_Storage/ContainersBlade/storageAccountId/%2Fsubscriptions%2F{svm.AzureSubscriptionId}%2FresourceGroups%2F{svm.AzureResourceGroupName}%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2F{azureStorageName}" },
                new { Name = nameof(svm.ApplicationInsightsInstrumentationKey), Tooltip = "View Application Logs", Url = $"https://ms.portal.azure.com/#blade/AppInsightsExtension/SearchBlade/ComponentId/%7B%22SubscriptionId%22%3A%22{svm.AzureSubscriptionId}%22%2C%22ResourceGroup%22%3A%22{svm.AzureResourceGroupName}%22%2C%22Name%22%3A%22{svm.AzureResourceGroupName}-appinsights-{uniqueStringInUrl}%22%7D/InitialFilter/%7B%22eventTypes%22%3A%5B4%2C1%2C3%2C5%2C2%2C6%5D%2C%22typeFacets%22%3A%7B%7D%2C%22isPermissive%22%3Afalse%7D/InitialTime/%7B%22durationMs%22%3A43200000%2C%22endTime%22%3Anull%2C%22isInitialTime%22%3Atrue%2C%22grain%22%3A1%7D/InitialQueryText//ConfigurationId/blankSearch%3A" },
                new { Name = nameof(svm.ASAJoinName), Tooltip = "View ASA Join Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAJoinName}" },
                new { Name = nameof(svm.ASAEvalName), Tooltip = "View ASA Policy Evaluation Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAEvalName}" },
                new { Name = nameof(svm.OnlineTrainerAddress), Tooltip = "Configure Online Trainer", Url = $"https://manage.windowsazure.com/microsoft.onmicrosoft.com#Workspaces/CloudServicesExtension/CloudService/{svm.OnlineTrainerAddress}/configure" }
            };
            var nameToEditable = new[]
            {
                new { Name = nameof(svm.TrainArguments), IsEditable = true },
                new { Name = nameof(svm.IsExplorationEnabled), IsEditable = true },
                new { Name = nameof(svm.InitialExplorationEpsilon), IsEditable = true },
                new { Name = nameof(svm.SelectedModelId), IsEditable = true }
            };
            var nameToSpotLightUrl = new[]
            {
                new { Name = nameof(svm.AzureResourceGroupName), IsSplotlightUrl = true }
            };
            var nameToResettable = new[]
            {
                new { Name = nameof(svm.OnlineTrainerAddress), Resettable = true }
            };
            var settingItems = from nv in nameToValue
                               from nht in nameToHelpText.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                               from nu in nameToUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                               from ne in nameToEditable.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                               from nsl in nameToSpotLightUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                               from nrs in nameToResettable.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                               select new SettingItemViewModel
            {
                Value           = nv.Value,
                DisplayName     = nht?.HelpText[0],
                HelpText        = nht?.HelpText[1],
                IsEditable      = ne?.IsEditable,
                Name            = nv.Name,
                Url             = nu?.Url,
                UrlToolTip      = nu?.Tooltip,
                IsSplotlightUrl = nsl?.IsSplotlightUrl,
                IsResettable    = nrs?.Resettable
            };

            return(settingItems.ToList());
        }
コード例 #15
0
        private List<SettingItemViewModel> CreateAppView(
            ApplicationClientMetadata clientMetadata,
            ApplicationExtraMetadata extraMetadata)
        {
            string uniqueStringInUrl = Regex.Match(Request.Url.ToString(), ".*mc-(.*).azurewebsites.*").Groups[1].Value;

            CollectiveSettingsView svm = CreateCollectiveSettings(clientMetadata, extraMetadata, uniqueStringInUrl);

            string azureStorageName = Regex.Match(svm.AzureStorageConnectionString, ".*AccountName=(.*);AccountKey.*").Groups[1].Value;

            var nameToValue = svm.GetType().GetProperties()
                .Select(p => new { Name = p.Name, Value = p.GetValue(svm) });

            var nameToHelpText = typeof(HelpText).GetProperties()
                .Where(p => p.PropertyType == typeof(string))
                .Select(p => new { HelpText = ((string)p.GetValue(null)).Split(new string[] { " ::: " }, StringSplitOptions.RemoveEmptyEntries).ToList(), Name = p.Name });

            var nameToUrl = new[]
            {
                new { Name = nameof(svm.AzureResourceGroupName), Tooltip = "View Azure Resource Group", Url = $"https://ms.portal.azure.com/#asset/HubsExtension/ResourceGroups/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}"},
                new { Name = nameof(svm.AzureStorageConnectionString), Tooltip = "View Data", Url = $"https://ms.portal.azure.com/#blade/Microsoft_Azure_Storage/ContainersBlade/storageAccountId/%2Fsubscriptions%2F{svm.AzureSubscriptionId}%2FresourceGroups%2F{svm.AzureResourceGroupName}%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2F{azureStorageName}"},
                new { Name = nameof(svm.ApplicationInsightsInstrumentationKey), Tooltip = "View Application Logs", Url = $"https://ms.portal.azure.com/#blade/AppInsightsExtension/SearchBlade/ComponentId/%7B%22SubscriptionId%22%3A%22{svm.AzureSubscriptionId}%22%2C%22ResourceGroup%22%3A%22{svm.AzureResourceGroupName}%22%2C%22Name%22%3A%22{svm.AzureResourceGroupName}-appinsights-{uniqueStringInUrl}%22%7D/InitialFilter/%7B%22eventTypes%22%3A%5B4%2C1%2C3%2C5%2C2%2C6%5D%2C%22typeFacets%22%3A%7B%7D%2C%22isPermissive%22%3Afalse%7D/InitialTime/%7B%22durationMs%22%3A43200000%2C%22endTime%22%3Anull%2C%22isInitialTime%22%3Atrue%2C%22grain%22%3A1%7D/InitialQueryText//ConfigurationId/blankSearch%3A"},
                new { Name = nameof(svm.ASAJoinName), Tooltip = "View ASA Join Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAJoinName}"},
                new { Name = nameof(svm.ASAEvalName), Tooltip = "View ASA Policy Evaluation Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAEvalName}"},
                new { Name = nameof(svm.OnlineTrainerAddress), Tooltip = "Configure Online Trainer", Url = $"https://manage.windowsazure.com/microsoft.onmicrosoft.com#Workspaces/CloudServicesExtension/CloudService/{svm.OnlineTrainerAddress}/configure"}
            };
            var nameToEditable = new[]
            {
                new { Name = nameof(svm.TrainArguments), IsEditable = true },
                new { Name = nameof(svm.IsExplorationEnabled), IsEditable = true },
                new { Name = nameof(svm.InitialExplorationEpsilon), IsEditable = true },
                new { Name = nameof(svm.SelectedModelId), IsEditable = true }
            };
            var nameToSpotLightUrl = new[]
            {
                new { Name = nameof(svm.AzureResourceGroupName), IsSplotlightUrl = true }
            };
            var nameToResettable = new[]
            {
                new { Name = nameof(svm.OnlineTrainerAddress), Resettable = true }
            };
            var settingItems = from nv in nameToValue
                        from nht in nameToHelpText.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                        from nu in nameToUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                        from ne in nameToEditable.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                        from nsl in nameToSpotLightUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                        from nrs in nameToResettable.Where(n => n.Name == nv.Name).DefaultIfEmpty()
                        select new SettingItemViewModel
                        {
                            Value = nv.Value,
                            DisplayName = nht?.HelpText[0],
                            HelpText = nht?.HelpText[1],
                            IsEditable = ne?.IsEditable,
                            Name = nv.Name,
                            Url = nu?.Url,
                            UrlToolTip = nu?.Tooltip,
                            IsSplotlightUrl = nsl?.IsSplotlightUrl,
                            IsResettable = nrs?.Resettable
                        };

            return settingItems.ToList();
        }
コード例 #16
0
 public static DecisionServiceClient <string> CreateJson(DecisionServiceConfiguration config, ApplicationClientMetadata metaData = null)
 {
     return(new DecisionServiceClient <string>(
                config,
                DownloadMetadata(config, metaData),
                new VWJsonExplorer(config.ModelStream, config.DevelopmentMode)));
 }
コード例 #17
0
 public static DecisionServiceClient <TContext> Create <TContext>(DecisionServiceConfiguration config, ITypeInspector typeInspector = null, ApplicationClientMetadata metaData = null)
 {
     return(new DecisionServiceClient <TContext>(
                config,
                DownloadMetadata(config, metaData),
                new VWExplorer <TContext>(config.ModelStream, typeInspector, config.DevelopmentMode)));
 }
コード例 #18
0
        private static ApplicationClientMetadata DownloadMetadata(DecisionServiceConfiguration config, ApplicationClientMetadata metaData)
        {
            if (!config.OfflineMode || metaData == null)
            {
                metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(config.SettingsBlobUri);
                if (config.LogAppInsights)
                {
                    Trace.Listeners.Add(new ApplicationInsights.TraceListener.ApplicationInsightsTraceListener(metaData.AppInsightsKey));
                }
            }

            return(metaData);
        }
コード例 #19
0
 private CollectiveSettingsView CreateCollectiveSettings(ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata, string uniqueStringInUrl)
 {
     var svm = new CollectiveSettingsView
     {
         ApplicationId = clientMetadata.ApplicationID,
         AzureSubscriptionId = extraMetadata.SubscriptionId,
         DecisionType = extraMetadata.DecisionType,
         TrainFrequency = extraMetadata.TrainFrequency,
         TrainArguments = clientMetadata.TrainArguments,
         AzureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString],
         AzureResourceGroupName = extraMetadata.AzureResourceGroupName,
         ApplicationInsightsInstrumentationKey = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKAppInsightsKey],
         OnlineTrainerAddress = $"http://{extraMetadata.AzureResourceGroupName}-trainer-{uniqueStringInUrl}",
         WebApiAddress = $"https://{extraMetadata.AzureResourceGroupName}-webapi-{uniqueStringInUrl}.azurewebsites.net",
         ASAEvalName = extraMetadata.AzureResourceGroupName + "-eval",
         ASAJoinName = extraMetadata.AzureResourceGroupName + "-join",
         EventHubInteractionConnectionString = clientMetadata.EventHubInteractionConnectionString,
         EventHubObservationConnectionString = clientMetadata.EventHubObservationConnectionString,
         ExperimentalUnitDuration = extraMetadata.ExperimentalUnitDuration,
         SelectedModelId = new SettingBlobListViewModel
         {
             Items = new List<BlobModelViewModel>()
             {
                 new BlobModelViewModel
                 {
                     Name = ApplicationSettingConstants.UseLatestModelSetting
                 }
             },
             SelectedItem = extraMetadata.ModelId
         },
         IsExplorationEnabled = clientMetadata.IsExplorationEnabled,
         InitialExplorationEpsilon = clientMetadata.InitialExplorationEpsilon,
         SettingsBlobUri = extraMetadata.SettingsTokenUri1
     };
     return svm;
 }
コード例 #20
0
ファイル: DecisionService.cs プロジェクト: yannstad/mwt-ds
 public static DecisionServiceClient <TContext> Create <TContext>(DecisionServiceConfiguration config, IContextMapper <TContext, ActionProbability[]> contextMapper, ApplicationClientMetadata metaData = null)
 {
     return(new DecisionServiceClient <TContext>(
                config,
                DownloadMetadata(config, metaData),
                contextMapper,
                // TODO: cleanup. this means that the context mapper passed in needs to be able to score from the beginning
                contextMapper));
 }
コード例 #21
0
        public DecisionServiceClient(
            DecisionServiceConfiguration config,
            ApplicationClientMetadata metaData,
            IContextMapper <TContext, ActionProbability[]> internalPolicy,
            IContextMapper <TContext, ActionProbability[]> initialPolicy = null,
            IFullExplorer <int[]> initialFullExplorer = null,
            IInitialExplorer <ActionProbability[], int[]> initialExplorer = null)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            if (config.InteractionUploadConfiguration == null)
            {
                config.InteractionUploadConfiguration = new JoinUploader.BatchingConfiguration(config.DevelopmentMode);
            }

            if (config.ObservationUploadConfiguration == null)
            {
                config.ObservationUploadConfiguration = new JoinUploader.BatchingConfiguration(config.DevelopmentMode);
            }

            this.config = config;
            string appId = string.Empty;

            this.metaData = metaData;

            if (config.OfflineMode)
            {
                this.recorder = new OfflineRecorder();
                if (config.OfflineApplicationID == null)
                {
                    throw new ArgumentNullException("OfflineApplicationID", "Offline Application ID must be set explicitly in offline mode.");
                }
                appId = config.OfflineApplicationID;
            }
            else
            {
                if (metaData == null)
                {
                    throw new Exception("Unable to locate a registered MWT application.");
                }

                if (this.recorder == null)
                {
                    var joinServerLogger = new JoinServiceLogger <TContext, int[]>(metaData.ApplicationID, config.DevelopmentMode); // TODO: check token remove
                    switch (config.JoinServerType)
                    {
                    case JoinServerType.CustomSolution:
                        joinServerLogger.InitializeWithCustomAzureJoinServer(
                            config.LoggingServiceAddress,
                            config.InteractionUploadConfiguration);
                        break;

                    case JoinServerType.AzureStreamAnalytics:
                    default:
                        joinServerLogger.InitializeWithAzureStreamAnalyticsJoinServer(
                            metaData.EventHubInteractionConnectionString,
                            metaData.EventHubObservationConnectionString,
                            config.InteractionUploadConfiguration,
                            config.ObservationUploadConfiguration);
                        break;
                    }
                    this.recorder = (IRecorder <TContext, int[]>)joinServerLogger;
                }

                var settingsBlobPollDelay = config.PollingForSettingsPeriod == TimeSpan.Zero ? DecisionServiceConstants.PollDelay : config.PollingForSettingsPeriod;
                if (settingsBlobPollDelay != TimeSpan.MinValue)
                {
                    this.settingsDownloader             = new AzureBlobBackgroundDownloader(config.SettingsBlobUri, settingsBlobPollDelay, downloadImmediately: false, storageConnectionString: config.AzureStorageConnectionString);
                    this.settingsDownloader.Downloaded += this.UpdateSettings;
                    this.settingsDownloader.Failed     += settingsDownloader_Failed;
                }

                var modelBlobPollDelay = config.PollingForModelPeriod == TimeSpan.Zero ? DecisionServiceConstants.PollDelay : config.PollingForModelPeriod;
                if (modelBlobPollDelay != TimeSpan.MinValue)
                {
                    this.modelDownloader             = new AzureBlobBackgroundDownloader(metaData.ModelBlobUri, modelBlobPollDelay, downloadImmediately: true, storageConnectionString: config.AzureStorageConnectionString);
                    this.modelDownloader.Downloaded += this.UpdateContextMapper;
                    this.modelDownloader.Failed     += modelDownloader_Failed;
                }

                appId = metaData.ApplicationID;
            }

            this.logger         = this.recorder as ILogger;
            this.internalPolicy = internalPolicy;
            this.initialPolicy  = initialPolicy;

            if (initialExplorer != null && initialPolicy != null)
            {
                throw new Exception("Initial Explorer and Default Policy are both specified but only one can be used.");
            }

            var explorer = new GenericTopSlotExplorer();

            // explorer used if model not ready and defaultAction provided
            if (initialExplorer == null)
            {
                initialExplorer = new EpsilonGreedyInitialExplorer(this.metaData.InitialExplorationEpsilon);
            }

            // explorer used if model not ready and no default action provided
            if (initialFullExplorer == null)
            {
                initialFullExplorer = new PermutationExplorer(1);
            }

            var match = Regex.Match(metaData.TrainArguments ?? string.Empty, @"--cb_explore\s+(?<numActions>\d+)");

            if (match.Success)
            {
                var numActions = int.Parse(match.Groups["numActions"].Value);
                this.numActionsProvider = new ConstantNumActionsProvider(numActions);

                this.mwtExplorer = MwtExplorer.Create(appId,
                                                      numActions, this.recorder, explorer, initialPolicy, initialFullExplorer, initialExplorer);
            }
            else
            {
                if (initialExplorer != null || metaData.InitialExplorationEpsilon == 1f) // only needed when full exploration
                {
                    numActionsProvider = internalPolicy as INumberOfActionsProvider <TContext>;
                    if (numActionsProvider == null)
                    {
                        numActionsProvider = explorer as INumberOfActionsProvider <TContext>;
                    }

                    if (numActionsProvider == null)
                    {
                        throw new ArgumentException("Explorer must implement INumberOfActionsProvider interface");
                    }
                }

                this.mwtExplorer = MwtExplorer.Create(appId,
                                                      numActionsProvider, this.recorder, explorer, initialPolicy, initialFullExplorer, initialExplorer);
            }
        }