Many Organisations want to create enterprise data science capability. The goals can include unlocking value from their data assets, reducing cost, and driving customer engagement. While many organisations have an initial capability, challenges can arise while "scaling and industrialization" into an enterprise service. This Point-of-view provides an opinionated design for a "fit for purpose" enterprise data science platform, delivered with Azure Machine Learning. It covers infrastructure, identity, data and functionality, aligned to an MLOps delivery framework.
2. Use Case Definition
The following use case is used to help define the scope of this PoV design.
This design:
Is for a fictitious mid-level enterprise, wanting to mature its data science function. The key goal is too standup an enterprise-ready platform that can support the 20 different projects, executing data science work packages. - The initial work package is a basic statistical model for consumption by internal resources.
Is for a solution that MUST deliver the following capabilities: - Support of an MLOps function - Enablement of innovation work
Has the following key Non Functional Requirements (NFRs) in order of importance: 1. Security 2. Cost Optimisation 3. System Governance 4. Supportability
Azure Machine Learning (AML). AML was selected due to the firm’s existing Microsoft footprint, skills and capabilities, the desire to lower the toil/risk from integration and interoperability, and the easy of scaling delivery when utilizing Microsoft tooling.
3. The Key Design Decisions (KDD)
Networking
N1 - Network access design
Decision - The use of Private endpoints (where available) are used to secure all egress/ingress of data.
Rational - Securing the service is the highest priority NFRs. Private endpoints (PE) provide the highest level of security for data transfer.
Impact - Solution endpoints are only available to defined, Azure services. They are non-addressable by anything else. - Increased solution Operating Expense (OPEX). - Increased initial configuration work for routing setup.
Implications - Endpoints that do not offer PE compatibility need to be either blocked, or otherwise hardened. - New Services maybe rejected based upon their lack of PE support (or similar controls) that is, preview or beta versions.
Considerations - Unsecured endpoints with Application native controls – discounted based upon security NFRs.
N2 - The network design to secure the service.
Decision - Removing the Network jump boxes from the design.
Rational - The Network jump boxes are excluded from the design, based upon cost and the acceptable security baseline already provided.
Impact - Decreased solution OPEX and complexity.
Implications - Users interact with the platform either via the portal, IDEs or command prompt/CLI.
Considerations - Implement Azure Bastion – discounted due to cost.
N3 - Safe listing key public ML package repositories.
Decision The following ML repositories are safe listed for the Platform, enabling data scientists to self-serve ML packages and libraries; - PyPI · The Python Package Index. - conda-forge - Microsoft Artifact Registry Outside of this, access to the public internet the platform is blocked.
Rational - This decision balances the requirement for specialized ML packages and libraries as a prerequisite to delivering value, while protecting the platform from the risks of open-source codebases. - Elements of AML, such as environment builds, require specific ML packages which by default access these repositories. Blocking this access, yet still enabling these processes, requires significant technical debt to address, and toil to maintain.
Impact - The Platform network denies any access to the public internet, asides from the safe listed sites. - An exception process is required for ML packages/libraries/binaries that are not available in the safe listed repositories. - A full security scanning process is required for all developed containerised models on upload, pre-deployment, with error trapping and full audit trails.
Implications - The Platform network acts as a security control, limiting the blast radius from any package issue. - This design acts as an attractive force for standardisation, encouraging the use of the languages supported by these safe listed repositories, i.e., Python. - Project Leads have an extended Responsible, Accountable, Consulted, and Informed (RACI), covering package management and usage within their workspace.
Considerations - Fully Private Repository Approach – discounted due complexity and toil introduced from seeding and maintaining the repository, bespoke configuration updates required, and the lag introduced into the MLOps processes. - Complete serve-self model with open public internet access – discounted due to security risks introduced. - Web Application Firewall (WAF) based package inspection – discounted due to OPEX cost, ML language gaps and configuration complexity.
Security
S1 - Secure SDLC implementation.
Decision - Aligning the platform design with an organisation's data classification under business ownership.
Rational - A key benefit of an enterprise approach is to drive reuse and economies of scale, while reducing complexity and duplication. The appropriate data access control is the main challenge to this approach. Aligning the platform design with data classification should provide the most balanced approach.
Impact - The Platform has multiple implementations of AML and related components. - Some levels of data duplication across implementations. - Enterprise and Department based AML implementations hosting multiple projects, therefore will be long standing implementations. - Project resources have access other project’s models/codebases within the same implementation.
Implications - Business data owner accepts the uplifted RACI of AML implementation decision making.
Considerations - Single enterprise implementation using AML project segregation – discounted based upon the lack of fine grain data access controls. - Each Project/model gets a separate AML implementation – discounted based upon complexity and cost.
Callout - If AML security is uplifted to provide fine grain data, metadata, and configuration controls, this decision should be reviewed.
S2 - Use Azure in-built roles.
Decision - In-build Azure Role Based Access Controls (RBAC) roles should be used. Custom roles should only be used on an exception basis, and proactively managed out.
Rational - Custom RBAC roles require the customer to adopt a Product Owner role. The toil and cost across the full lifecycle doesn’t provide enough Return On Investment (ROI) to justify the commitment.
Impact - Identity and Access Management (IAM) design is simplified. - Operational overhead, expense, and risk are reduced.
Implications - Automation/compute processes may be introduced to provide a further layer of abstraction and control.
Considerations - Custom Roles – discounted, due to the toil and cost across the full lifecycle.
Callout - Microsoft is committed to consistently improving the security posture of its services and products.
S3 - Security is balanced against cost and use case need.
Decision - The design balances security against cost and use case need.
Rational - To provide an acceptable ROI, this platform must support a data science capability at reasonable cost.
Impact - While the platform delivers an enterprise security baseline, component and control configuration beyond this level will be balance against cost, functionality and ways of working impact.
Implications - Premium services that could provide the strongest security posture maybe be discounted based upon cost such as the use of confidential computing.
Callout - Every customer is urged to review this KDD within their own specific constraints, and use case context.
Decision - This platform design algins with a "Zero Trust" security model.
Rational - "Zero Trust" offers the highest level of security protection, as it removes implicit trust from services, components or people when interacting with the platform. Securing the service is a top priority NFR.
Impact - All elements of the platform are secured using identities within a consistent RBAC framework, governed via central policies.
Implications - No implicit trust is granted to any interactions behind the secure network perimeter. All Interactions and connectivity are enabled via explicit RBAC and policies.
Considerations - Secure Network – discounted "Zero Trust" is additive.
Callout - This approach aligns with Microsoft guidance for secure design.
S5 - Reliance on Microsoft to secure services/components.
Rational - Customer Managed Keys (CMK) introduce toil, cost, and risk into the management and administration of the platform that only delivers a marginal uplift in security (depending on the maturity of the management process within the customer).
Impact - Acceptance of the Microsoft process and standards for managing keys, certificates, and secrets.
Considerations - CMK – discounted due the toil, cost and risk from this process.
Callout - For projects using the highest classification of data, CMK maybe considered for the highest level of security. But this project implementation would be treated as an exception under this design.
Service/Component Selection
C1 - Use Azure components.
Decision - The preference for component selection is (in order); 1. Azure native. 2. Azure first party. 3. Available via the Azure marketplace. 4. Other.
Rational - This service selection preference provides the strongest support for platform integration, interoperability, and a consistent security baseline.
Impact - All Azure native services and components are preferred.
Implications - Components and services maybe discounted based upon their Azure status.
Callout - Azure products and services evolve quickly, with feature hardened and uplift driven by customer feedback. Meaningful gaps are often quickly addressed.
C2 - Cloud Services preference.
Decision - There is a strong preference for PaaS service selection.
Rational - This decision reflects a cloud native design, reducing toil and risk from non-value add activities.
Impact PaaS services are selected above others. Security design shifts from network and boundary controls to identity.
Implications Above the line OPEX costs may appear higher than normal. Customers must accept the reduction in control, flexibility, and custom extension to services.
Callout - True Total-Cost-of-Ownership (TCO) often contains a large factor of "hidden costs", due management and administration tasks carried out by a customer's resource pool. PaaS reduces this, at a cost.
C3 - Reuse of Microsoft AI services.
Decision - Where appropriate, solutions reuse the AI services provided by Microsoft, rather than build bespoke/custom AI services.
Rational - Microsoft is better placed to support the full Software Development Lifecycle (SDLC) of these services, reducing toil and risk for non-value add activities, along with lifecycle TCO.
Impact The Platform network design must support the API interoperability required by Microsoft’s AI services. Individual solutions need API interoperability. Uplift in the support RACI for Data Science leads across the evolution of AI services, particularly for the currently used suite.
Implications - Individual solutions could have one-to-many Microsoft AI services as subcomponents of that solution.
Considerations - Bring-Your-Own/Custom solutions – discounted due to the RACI of the product ownership role across the full lifecycle.
Software Development Lifecycle
D1 - Standing, Shared Test Environments.
Decision - The Staging and QA test environments remain standing, as a shared asset across the platform. To reduce cost, these environments should be stripped back, removing all model elements when not being used in a testing cycle.
Rational - This approach enables greater reuse, speed-to-market, reduced complexity for setup and service interoperability.
Impact - There must be an automated process to deploy, test, and strip back individual models, while leaving the testing workspaces and shared elements in place.
Implications - Only compute processes have access to these test environments. - An automated test harness is required for Staging and QA.
Considerations - Environments tore down post use – discounted based upon orchestration and implementation complexity introduced. - Each Project or model gets a separate Testing environment – discounted based upon cost.
D2 - Access to Production assets to support iteration/uplift cycles.
Decision - Development is able to access production models, configuration, metadata and model data.
Rational - Production data and code are a required input into the uplift and enhancement of an existing model.
Impact - This access is temporary/elevated access to specific production assets controlled under an RBAC design. - Copies of production data will be created in the development data store.
Implications - The Platform requires a "fit for purpose" data/asset catalog that is available to data scientists, providing transparency of current models and their performance. - Data scientists must have access to logging and monitoring details of productionised models to inform iteration cycles.
Considerations - Open Development access - discounted due to security risks. - Development in Production – discounted due to the requirements of changing or update elements, along with ensuring compute and traffic segregation.
Callout - Development activities often required the creation of test data, boundary use cases, skewing of values, etc. Synthetic test data can materially impact the quality/consistency of a model's outputs.
D3 - Testing in Production.
Decision - The Staging and QA test environments are implemented in production, using production assets.
Rational - A “Fit for purpose” testing baseline, especially for model iteration, requires current production datasets.
Impact - Testing components have access to production data. - Reduction in toil for testing phases, greater accuracy in outcomes.
Implications - RBAC & Identity implementation that clearly separates testing and productionised components.
Considerations - Segregated Testing Environments – discounted based upon requirement for production data and the implementation cost and complexity introduced. - Each Project/model gets a separate Testing implementation – discounted based upon cost.
Callout - Synthetic test data can materially impact the quality/consistency of a model's outputs.
D4 - Automate toil away.
Decision - Where is there reuse and value, tasks should be automated.
Rational - Automation increases service reliability, scale, compliance and security, reduce cost and risk, while enabling a greater focus on value-add tasks.
Impact - Automation tooling covering the SDLC is required to support the platform.
Implications - Resource capacity should be allocated to the maintenance and uplift of automation across the platform.
Considerations - Automate everything, upfront – discounted due to lag and lack of direct business value delivered from this work.
D5 - Implement an MLOps framework.
Decision - This platform design implements an MLOps framework to support the full SDLC lifecycle of ML models.
Rational - An MLOps framework creates more efficient, less costly or risky workflows, increase scalability, collaboration, and model output quality, while reducing risk and errors.
Impact - MLOps specific tooling is required to support the platform.
Implications - Resource capacity should be allocated to the maintenance and uplift of MLOps capabilities and functions.
Considerations - Implement DevOps - discounted due to specific requirements of ML lifecycle and the gaps such an approach would introduce. - Implement in a later phase – discounted due to the technical debt created.
Rational - This balances service resiliency with OPEX cost, and the low likelihood of a full regional outage.
Impact - Data is replicated across each availability zone within the hosting region. - The Platform service will be impacted by a full outage in the hosting region.
Implications - In the case of a full regional outage, the platform would be dependent upon Microsoft service recovery, as a prerequisite to its own service recovery.
Considerations - Lower levels of redundancy – discounted due to the service resiliency requirements. - Higher levels of redundancy – discounted due to cost and low risk region failure.
Callout - Microsoft hasn’t had a full regional outage (as at March 2024), although there are rare instances of key services going down, effectivity taking down regions.
4. Design Overview
4.1. Platform Logical Design
At a high level, the enterprise AML platform logical design can be illustrated as:
This AML design the completed ML model lifecycle, enabled by a MLOps framework.
The platform is split across two environments, reflecting data access security requirements while enabling the iteration of existing productionized models.
The design contains; - Share assets/components which all workspaces use, irrespective of data classification scope, that is, monitoring, deployment, testing workspaces, etc. - Foundation elements, which represent the enterprise implementation, intending to support many ML projects that have a data classification of general or lower. - Dept/Project Assets are either departments or individual solutions, reflecting the in-scope data classification, separated from the enterprise implementation.
Microsoft’s cloud-based AI services and APIs are be available as a shared enterprise service. This approach simplifies the process of adding AI features and reducing cost and risk across the full product lifecycle from custom solutions.
Both Enterprise and department implementations support one-many individual projects, therefore having a lifecycle outside of the individual projects. This design requires an uplifted RACI with nominated business owners of to manage/administer each implementation, ensuring tasks like project/data clean up, etc. are appropriately executed.
For audit and iteration purposes, production generated data is immutable/append only. To enable development activities like test data creation, edge cases, etc. the development workspaces are able to create & update data as required.
4.2. Azure Components/Services
Building on top of the Foundational elements, the following ML specific components would be added:
ML Services:
Azure Machine Learning (AML): Central hub for the machine learning experiments, datasets, and models, supporting the full ML model lifecycle.
Azure ML Registry: organization-wide repository of machine learning assets such as models, environments, and components.
Azure AI Services: out-of-the-box and customizable ML APIs, and models. These include services to support natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making. - AI Services includes Cognitive Services suite of ML services
Some Foundational elements would be extended to support the ML components, i.e. Azure Policies would be extended to cover ML component specific governance, ML components would be configured to ship logs to Azure Monitor – Log Analytics workspaces etc.
4.3. Design Assumptions and Constraints
Key Assumptions
Each data source in scope has a clear Business owner who accepts the uplifted RACI of AML workspace decision maker.
The existing Azure enterprise platform contains enterprise shared components, that this design can reuse. This includes ExpressRoutefor on-perm connectivity, Microsoft Entra ID for access and authentication, Sentinel for SEIM and SOAR, Defender for threat protection, etc.
There's a "fit for purpose" Data governance application and process in-place, providing transparency, classification, and structure to data available across the eco-system.
There's a "fit for purpose" CI/CD automation application, such as Azure DevOps, and infrastructure monitoring application, such as Azure Monitoring, in-place.
The Data Scientists need access to a deployed model's full lineage to enable the future uplift iterations.
The three safe listed ML package repositories contain ~80% of all required ML packages, libraries, and binaries needed across an enterprise ML capability. Therefore, the other 20% can be sourced using an exception process without introducing unacceptable lag, toil, or expense.
This design is generalized and doesn’t reflect any specific regulatory standard or ML model use case. Customers should considered their own requirements and context when considering this PoV.
4.4. Anti-Patterns
"Copy & Paste" this design without considering individual context or requirements.
Set & Forget implementations – Cloud services must be proactively monitored and managed.
Not proactively managing cost.
Not covering the full MLOps Lifecycle, including retirement of models.
Business stakeholders who don’t understand or accept the Operating Model RACI.
Embedding ML Project Leads without the time/priority to complete the addition tasks under the Operating Model RACI, that is, the break and fix support for the production model.
Implementation of custom elements without understanding the full lifecycle and responsibilities of the "Product Ownership" role.
At a high level, this design can be illustrated as:
The key features of this network design are:
Private and Isolated Services with Virtual Network (VNet) Integration: VNet Integration of an AML workspace is required to bring the workspace onto the Azure Backbone. VNet Injection can be implemented via Private link and Private endpoints that secure AML resources and restrict all access within a private network. VNet integration is also used to isolate AML resources and control all inbound/outbound traffic. - An individual AML workspace uses multiple resources, such as Key Vault, Storage accounts, etc. This implementation requires the extension of the private endpoint configuration, securing all dependent resources ensuring a complete, unified secure design.
Fine Grain Control via Network Security Groups (NSGs): NSGs are firewall-like constructs that define and enforce inbound and outbound network traffic rules at the subnet or network interface level. NSGs provide granular control over network traffic, enabling you to permit or deny specific protocols, ports, and IP addresses.
Uplifted Boundary Protection via Distributed denial of service attacks (DDOS): Enabling Azure DDoS (distributed denial of service attacks) Protection Standard safeguards against distributed DDoS attacks.
Private Connectivity with Express Route (ER): ExpressRoute provides a private and dedicated network connection between your on-premises network and Azure ML and other resources in Azure. It improves data transfer performance, enhances security, and ensures compliance with data privacy regulations.
The complete network architecture can be illustrated as:
Important:
ML-assisted data labeling doesn't support default storage accounts that are secured behind a virtual network. You must use a non-default storage account for ML-assisted data labeling. The non-default storage account can be secured behind the virtual network.
5.1. ML Package Approach
The Problem Statement:
Data scientists often require large numbers of highly specialized packages, libraries or binaries as “building blocks” for ML solutions.
Many of these packages are community developed, iterate with fast-paced development cycles, and required "Subject Matter Expert" (SME) knowledge to understand and use.
Traditional approaches to software management for this requirement, often result in expensive, toil-filled processes, which act as a bottleneck on the delivery of value.
Context:
There are industry standard package repositories, typically aligned to programming language that serve the ML community for most requirements.
Approach:
Safelist three industry standard ML package repositories, allowing self-serve from individual AML workspaces. Then, use an automated testing process during the deployment to scan the resulting solution containers. Failures would elegantly exit the deployment process and remove the container.
Process Flow
Data scientists working within a specific AML workspace with network configuration applied, can self-serve ML packages on-demand from the whitelisted repositories. - An exception process is required for everything else, using the Private Storage pattern, seeded/maintained via a centralized function.
AML delivers ML solutions as docker containers. As these solutions are developed, they are uploaded to the Azure Container Registry (ACR). Defender for Containers would be used to for the vulnerability scanning process.
Solution deployment occurs via a CI/CD process. Defender for DevOps is used across the stack to provide security posture management and threat protection.
Only if the solution container passes each of the security processes will it be deployed. Failure will result in the deployment elegantly exiting with error notifications, full audit trails and the solution container being discarded.
5.2. MVP Monitoring
The suggested MVP monitoring for this design is:
5.2.1.1 - Model Performance – Data Drift
Description - Data drift tracks changes in the distribution of a model's input data by comparing it to the model's training data or recent past production data. Environment - Production. Implementation - AML – Model Monitoring. Notes - Data drift refactoring requires recent production datasets and outputs, to be available for comparison.
5.2.1.2 - Model Performance – Usage
Description - Several model serving endpoint metrics to indicate quality and performance. Environment - All. Implementation - Azure Monitor AML metrics. Notes - This table has the supporting information to identify the AML workspace, deployment etc.
5.2.1.3 - Model Performance – Prediction Drift
Description - Prediction drift tracks changes in the distribution of a model's prediction outputs by comparing it to validation or test labeled data or recent past production data. Environment - Production. Implementation - Azure Monitor AML metrics. Notes - Prediction drift refactoring requires recent production datasets and outputs, to be available for comparison.
5.2.2.1 - Usage - Client Requests
Description - Count of the Client Requests to the model endpoint. Environment - Production. Implementation; - Machine Learning Services - OnlineEndpoints. - Count of RequestPerMintute. Notes - Acceptable thresholds could be aligned to t-shirt sizing’s or anomalies (acknowledging the need to establish a baseline). - When a model is no longer being used, it should be retired from production.
5.2.2.2 - Usage - Throttling Delays
Description - Throttling Delays in request and response in data transfer. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Sum of RequestThrottlingDelayMs. - ResponseThrottlingDelayMs. Notes - Acceptable thresholds should be aligned service's "Service Level Agreement" (SLA) and the solution's non-functional requirements (NFRs).
5.2.2.3 - Usage - Errors Generated
Description - Response Code - Errors generated. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Count of XRequestId by ModelStatusCode. - Count of XRequestId by ModelStatusCode & ModelStatusReason. Notes - All HTTP responses codes in the 400 & 500 range would be classified as an error.
5.2.3 - Budget Boundaries
Description - When monthly Operating expenses (OPEX), based on usage or cost, reaches or exceeds a predefined amount. Environment - All. Implementation - Azure – Budget Alerts. Notes; - Budget thresholds should be set based upon the initial NFR’s and cost estimates. - Multiple threshold tiers should be used, ensuring stakeholders get appropriate warning before the budget is exceeded. - Consistent budget alerts could also be a trigger for refactoring to support greater demand.
5.2.4 - Workspace – Staleness
Description - When an AML workspace no longer appears to have active use. Environment - Development. Implementation; - Azure Monitor AML metrics; - Machine Learning Services - Workspaces - count of Active Cores over a period. Notes; - Active Cores should equal zero with aggregation of count. - Date thresholds should be aligned to the project schedule.
5.2.5 - Security Controls inc. RBAC
Description - Ensuring the appropriate security controls and baseline are implemented and not deviated from. Environment - All. Implementation; - Azure – Policies. - Including the “Audit usage of custom RBAC roles”. Notes;. - The full listing of available in-built policies is available for AML. - Other components/services used in this design should also have their specific in-built policies reviewed and implemented where appropriate.
5.2.6 - Deployment – Standards/Governance
Description - Ensuring the appropriate standards and guardrails are adhered too. Environment - Azure & CI/CD. Implementation; - Azure – DevOps Pipelines. - PSRule for Azure. - Enterprise Policy As Code (EPAC) (azure.github.io). Notes; - PSRule provides a testing framework for Azure Infrastructure as Code (IaC). - EPAC can be used in CI/CD based system deploy Policies, Policy Sets, Assignments, Policy Exemptions and Role Assignments. - Microsoft guidance is available in the Azure guidance for AML regulatory compliance.
5.2.7 - Deployment – Security Scanning
Description - Automated security scanning is executed as part of the automated integration and deployment processes. Environment - CI/CD. Implementation - Azure – Defender For DevOps. Notes - This processes can be extended with Azure marketplace for 3rd party security testing modules.
5.2.8 - Model – Endpoint Security
Description - Targeted security monitoring of any AML endpoint. Environment - All. Implementation - Azure – Defender For APIs.
5.2.9 - Development – Ongoing service
Description - A development model appearing provide a regular service that should be productionised. Environment - Development. Implementation; - Azure Monitor AML metrics. - AMLOnlineEndpointTrafficLog - count of XMSClientRequestId over a month. Notes - Date thresholds should be aligned to the project schedule.
Important:
Several of the implementations are in Preview (as at Mar ‘24), please refer to Preview Terms Of Use for greater detail.
6. Security
6.1. SDLC Access Patterns
The Access patterns required to support the full Software Development Lifecycle (SDLC) can be illustrated as:
System/compute access to components/services is based upon identity, with Managed identities being preferred due to the strong security posture.
Individuals access to components/services and data are based upon their Microsoft Entra ID identity, and its Azure – RBAC group membership. - The design will use Azure defined RBAC roles over custom roles due to the reduced operating toil and risk of keeping custom roles up-to-date.
Access patterns can be aligned to the SDLC phase; - Development - the access required to support the analysis, development, and initial testing of ML models. The access required by a new implementation is a subset of the access requirement for the iteration of an existing solution. - Testing - temporary access required to support the deployment and Quality Assurance (QA) model testing as a prerequisite to production release. - Production – the access required by a productionize ML model, released via an Azure AML endpoint to downstream consumers.
Azure AI Services APIs are available to development processes as part of the enterprise shared service. Once the model is productionized, a workspace specific implementation of that API is used.
Depending on the individual solution's non functional requirements (NFRs), serving a model via an AML endpoint may not be appropriate. Other services, such as App Service, Azure Kubernetes Service (AKS), etc., could be considerd. But these requirements are Out-of-scope for this PoV.
6.2. Identity RBAC – Personas
This design considers the following Persona’s to inform the identity-based RBAC group design:
R1 - Data Scientist/ML Engineer
Description - The people doing the various ML and data science activities across the SLDC lifecycle for a project. This role's responsibilies include break and fix activities for the ML models, packages, and data, which sit outside of platform support expertise. Type - Person. Project Specific - Yes. Notes - Involves data exploration and preprocessing to model training, evaluation, and deployment, to solve complex business problems and generate insight.
R2 - Data Analyst
Description - The people doing the data analyst tasks required as an input to data science activities. Type - Person. Project Specific - Yes. Notes - This role involves working with data, performing analysis, and supporting model development and deployment activities.
R3 - Model Tester
Description - The compute process used in Staging & QA testing. Type - Person. Project Specific - Yes. Notes - This role provides functional segregation from the CI/CD processes.
R4 - Business Stakeholders
Description - Business stakeholders attached to the project. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace components in development.
R5 - Project Lead (Data Science Lead)
Description - The Data Science lead in a project administration role for the AML workspace. Type - Person. Project Specific - Yes. Notes - This role would also have break/fix responsibility for the ML models and packages used.
R6 - Project Owner (Bus Owner)
Description - The Business stakeholders responsible for the AML workspace based upon data ownership. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace configuration and components in development. Production coverage will be provided by the data governance application.
R7 - Platform Technical Support
Description - The Technical support staff responsible for break/fix activities across the platform. This role would cover infrastructure, service, etc. But not the ML models, packages or data. These elements remain under the Data Scientist/ML Engineer role's responsibility. Type - Person. Project Specific - No. Notes - While the role group is permanent, membership is only transient, based upon a Privileged Identity Management (PIM) process for time boxed, evaluated access.
R8 - Model End User
Description - The End consumers of the ML Model. This role could be a downstream process or an individual. Type - Person and Process. Project Specific - Yes.
R9 - CI/CD processes
Description - The compute processes that releases/rolls back change across the platform environments. Type - Process. Project Specific - No.
R10 - AML Workspace
Description - The managed identities used by an AML workspace to interact with other parts of Azure. Type - Person. Project Specific - No. Notes - This persona represents the various services that make up an AML implementation, which interact with other parts of the platform, such as, the development workspace connecting with the development data store, etc.
R11 - Monitoring Processes
Description - The compute processes which monitor & alert based upon platform activities. Type - Process. Project Specific - No.
R12 - Data Governance Processes
Description - The compute process that scans the ML project and datastores for data governance. Type - Process. Project Specific - No.
6.3. Identity RBAC – Control Plane
The Control plane is used to manage the resource level objects with a subscription.
The Persona based identity RBAC design for the control plane for each environment can be described as;
Production:
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
Development:
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. LAR = Log Analytics Reader. LAC = Log Analytics Contributor. MR = Monitoring Reader. MC = Monitoring Contributor.
Important:
Once a model has been productionized using one or more Azure AI Services API’s, service specific built-in roles should be implemented into that project.
6.4. Identity RBAC – Data/Model Plane
The Data plane is used to manage the capabilities exposed by a resource.
The Persona based identity RBAC design for the data plane for each environment can be described as;
Production:
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
Development:
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. KVA = Key Vault Administrator. KVA = Key Vault Administrator.
Important:
Data plane controls are additive to the Control plane, i.e. they build on top of them.
The Data plane controls vary depending on the specific AI Service selected, its recommended to take to most restrictive scope matched with the most appropriate built-in role available for the role/task requirements.
7. SDLC Flow
This section describes the full Software Development Lifecycle (SDLC) for a departmental ML model.
A Departmental ML model development describes the most detailed work-through of the process. An Enterprise process is a simplified version of this process.
7.1. Step 1 – Create Development
For a new development, the first step is to create the development environment with the various AML components required and develop the initial version of the ML model.
Prerequisites
Assess the in-scope data, validating the reuse of the Enterprise or an existing Department implementation.
Confirm the Project Lead and Business owner roles, and validate understanding/acceptance of the Responsible, Accountable, Consulted, and Informed (RACI).
Process Flow
Create the Department related development Entra ID groups as described on the identity RBAC section.
From deployment templates, create the AML workspace and data storage components in the development environment, linking together with compute identities. - This deployment includes linking to the production instance of the enterprise shared Microsoft's AI service API’s suite. - Tagging of components/services is key to driving policies, monitoring, and cost attribution.
From deployment templates, create the AML data store in the development environment. - This approach enables the workspace users to create, alter, or update data as required to support the development process.
Enable the Workspace compute managed identities to access the data storage.
Update the Monitoring and Alerting rules for a new department workspace in the development environment, as per the MVP Monitoringsection.
From this baseline, the project team is able to start ML development activities.
Important:
This worked example is for a new Dept setup, but the same process would apply for the initial Enterprise or individual project setups.
7.2. Step 2 – Push to testing
Once the model completes the initial testing phases, it should progress through Quality Assurance (QA) testing. If testing is failed, this process would exit with alerting back to the project. The new model elements would be removed, enabled access backed out, and process logs made available for trouble-shooting.
Process Flow
Using the CI/CD framework, the model, configuration and metadata are "pulled" into the deployment pipeline.
Update the Monitoring and Alerting rules for a new model entering the testing phase, as per the MVP Monitoring section.
Model data (if necessary) is populated into the production data to support the testing tasks.
The Shared Staging workspace is updated for the new model deployment and components are stood-up to complete model/manifest deployment testing.
Once staging has completed, the Shared QA workspace is updated for the new model deployment. QA Components are stood-up to complete integration, performance & volume, and security testing, etc. - This phase of testing will be extended over time as individual projects extend the QA testing harness.
All audit & testing logs are made available back to the project team.
7.3. Step 3 – Release to Production
Once the model completes QA testing, it would be deployed into production. Process failure would trigger a support incident, in addition to the failure attributes as described for Step 2.
Process Flow
Create the Department related production Entra ID groups as described on the identity RBAC section.
Removing the model and data components from the Staging and QA workspaces.
From deployment templates, create the department specific data store in the production immutable data store, tagged appropriately.
From deployment templates, create the department specific AML production workspace using its managed identities connect to the data store.
From deployment templates, link to the department specific Azure AI Services (for the subset of required services) via the AML production workspace – managed identity.
From deployment templates, create the department ML repository in production using its managed identity connect to the AML workspace and the data store.
Deploy the production workspace endpoint, enabling downstream processes or individuals to access/interact with the model. - Depending upon the desired Service Level Agreement (SLA) or Non Functional Requirements (NFRs), other model serving methods maybe appropriate such as Web Apps, Azure Kubernetes Service (AKS) etc. These options aren’t covered in this PoV.
Update the Monitoring and Alerting rules for a new model entering production, as per the MVP Monitoring section.
7.4. Step 4 – Iteration
A Productionized model requires iterative development to ensure it remains "fit for purpose", addressing either data or prediction drift. This iterative process is the next step in the model development lifecycle.
Prerequisites
Signals from the production model process demonstrating a degradation in performance, output, cost, etc.
Process Flow
Depending on timing, the development workspace may have been removed from the environment. If so, a new development deployment would be required following the Step 1 process.
From the Production ML repository, copy across the current version model, configuration, metadata, logs, etc. providing the baseline to work from and inform the iteration refactoring activities.
From the Immutable production data store, copy across the existing model’s datasets and register them for use in the deployment workspace - Depending on the scope/context of the work, this connection maybe a one-off or periodically required to get the latest updates. - The replication of data enables developers and testers to create or update data as required, without impacting the "golden record". - Other non-ML datasets would be ingested at this stage, if needed.
From this baseline, the project team is able to start the refactoring activities.
7.5. Step 5 – Iteration Testing
As before, once the model iteration completes initial testing, it should progress through quality assurance testing. This process follows the process from Step 2 with the addition of ML Repository component.
Process Flow
Using the CI/CD framework, the model, configuration and metadata are "pulled" into the deployment pipeline.
The Department ML Repository is populated for the iterative deployment.
The Enterprise Staging workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
Staging Components are stood-up to complete model/manifest deployment testing.
The Enterprise QA workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
QA Components are stood-up to complete integration, Performance & volume, and security testing.
Once completed, the iterative model would be versioned and then released to production, following the process from Step 3.
7.6. Step 6 – Retirement
When a model has been replaced, depreciated or no longer delivers business value, it should be removed from the environment. For completeness, the process of removing a department installation is described here. An individual Model retirement would be a subset of these steps.
Process Flow
Using the CI/CD framework, shut down the model serving endpoint, taking the model effectivity offline. - This approach "smoke tests" the removal, uncovering any hidden dependant solutions or processes.
Removing the Department/model specific monitoring and alerting rules, false positives aren’t raised during this process.
Removing the Department development workspace and related identities.
Removing the Department development data store and data.
Upload copies of the model, configuration, and metadata, to an archive, if necessary.
Removing the Department ML repository, production workspace components and related identities.
Removing the Department production data store. Data could also be transitioned to a cooler service tier, if long term retention is a requirement.
Removing the Department specific Entra ID groups and identities.
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Social_Sharing\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:MachineLearningBlog\",\"message:4111655\"],\"name\":\"BlogMessagePage\",\"props\":{},\"url\":\"https://techcommunity.microsoft.com/blog/machinelearningblog/an-enterprise-design-for-azure-machine-learning---an-architects-viewpoint/4111655\"}}})":{"__typename":"ComponentRenderResult","html":""}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCoverImage\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCoverImage-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeTitle\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTimeToRead\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeDescription\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1737571274000"}],"message({\"id\":\"message:4119231\"})":{"__ref":"BlogReplyMessage:message:4119231"},"message({\"id\":\"message:4114009\"})":{"__ref":"BlogReplyMessage:message:4114009"},"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1737571274000"}],"cachedText({\"lastModified\":\"1737571274000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1737571274000"}]},"CachedAsset:pages-1743057497099":{"__typename":"CachedAsset","id":"pages-1743057497099","value":[{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1743057497099,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:AI":{"__typename":"Category","id":"category:AI","entityType":"CATEGORY","displayId":"AI","nodeType":"category","depth":3,"title":"Artificial Intelligence and Machine Learning","shortTitle":"Artificial Intelligence and Machine Learning","parent":{"__ref":"Category:category:solutions"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:solutions":{"__typename":"Category","id":"category:solutions","displayId":"solutions","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Topics","entityType":"CATEGORY","shortTitle":"Topics"},"Blog:board:MachineLearningBlog":{"__typename":"Blog","id":"board:MachineLearningBlog","entityType":"BLOG","displayId":"MachineLearningBlog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"AI - Machine Learning Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:AI"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:solutions"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:AI"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"AI - Machine Learning Blog","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"eventPath":"category:AI/category:solutions/category:communities/community:gxcuf89792board:MachineLearningBlog/","tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":false,"tagType":"PRESET_ONLY"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc","height":512,"width":512,"mimeType":"image/png"},"Rank:rank:4":{"__typename":"Rank","id":"rank:4","position":6,"name":"Microsoft","color":"333333","icon":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}"},"rankStyle":"OUTLINE"},"User:user:1270277":{"__typename":"User","id":"user:1270277","uid":1270277,"login":"nimoore","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xMjcwMjc3LTMzODQ4NWlFOTM0OTc5RkM5MzNBMDZD"},"rank":{"__ref":"Rank:rank:4"},"email":"","messagesCount":2,"biography":null,"topicsCount":2,"kudosReceivedCount":10,"kudosGivenCount":1,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2022-01-09T17:17:06.070-08:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"BlogTopicMessage:message:4111655":{"__typename":"BlogTopicMessage","uid":4111655,"subject":"An Enterprise Design for Azure Machine Learning - An Architect's Viewpoint","id":"message:4111655","revisionNum":10,"repliesCount":2,"author":{"__ref":"User:user:1270277"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Blog:board:MachineLearningBlog"},"conversation":{"__ref":"Conversation:conversation:4111655"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:4111655"},"teaser":"
This article provides an opinionated design for an enterprise-level data science capability, implemented within an Azure data platform. The guidance provides a starting point for the design of an ML platform that fits your business requirements.
","body":"
1. Problem Statement
\n
\n
Many Organisations want to create enterprise data science capability. The goals can include unlocking value from their data assets, reducing cost, and driving customer engagement. While many organisations have an initial capability, challenges can arise while \"scaling and industrialization\" into an enterprise service. This Point-of-view provides an opinionated design for a \"fit for purpose\" enterprise data science platform, delivered with Azure Machine Learning. It covers infrastructure, identity, data and functionality, aligned to an MLOps delivery framework.
\n
\n
2. Use Case Definition
\n
\n
The following use case is used to help define the scope of this PoV design.
\n
This design:
\n
\n
\n
Is for a fictitious mid-level enterprise, wanting to mature its data science function. The key goal is too standup an enterprise-ready platform that can support the 20 different projects, executing data science work packages. - The initial work package is a basic statistical model for consumption by internal resources.
\n
\n
\n
Is for a solution that MUST deliver the following capabilities: - Support of an MLOps function - Enablement of innovation work
\n
\n
\n
Has the following key Non Functional Requirements (NFRs) in order of importance: 1. Security 2. Cost Optimisation 3. System Governance 4. Supportability
\n
\n
\n
Azure Machine Learning (AML). AML was selected due to the firm’s existing Microsoft footprint, skills and capabilities, the desire to lower the toil/risk from integration and interoperability, and the easy of scaling delivery when utilizing Microsoft tooling.
\n
\n
3. The Key Design Decisions (KDD)
\n
\n
\n
Networking
\n
\n
\n
\n
N1 - Network access design
\n
\n
Decision - The use of Private endpoints (where available) are used to secure all egress/ingress of data.
\n
Rational - Securing the service is the highest priority NFRs. Private endpoints (PE) provide the highest level of security for data transfer.
\n
Impact - Solution endpoints are only available to defined, Azure services. They are non-addressable by anything else. - Increased solution Operating Expense (OPEX). - Increased initial configuration work for routing setup.
\n
Implications - Endpoints that do not offer PE compatibility need to be either blocked, or otherwise hardened. - New Services maybe rejected based upon their lack of PE support (or similar controls) that is, preview or beta versions.
\n
Considerations - Unsecured endpoints with Application native controls – discounted based upon security NFRs.
\n
\n
\n
N2 - The network design to secure the service.
\n
\n
Decision - Removing the Network jump boxes from the design.
\n
Rational - The Network jump boxes are excluded from the design, based upon cost and the acceptable security baseline already provided.
\n
Impact - Decreased solution OPEX and complexity.
\n
Implications - Users interact with the platform either via the portal, IDEs or command prompt/CLI.
\n
Considerations - Implement Azure Bastion – discounted due to cost.
\n
\n
\n
N3 - Safe listing key public ML package repositories.
\n
\n
Decision The following ML repositories are safe listed for the Platform, enabling data scientists to self-serve ML packages and libraries; - PyPI · The Python Package Index. - conda-forge - Microsoft Artifact Registry Outside of this, access to the public internet the platform is blocked.
\n
Rational - This decision balances the requirement for specialized ML packages and libraries as a prerequisite to delivering value, while protecting the platform from the risks of open-source codebases. - Elements of AML, such as environment builds, require specific ML packages which by default access these repositories. Blocking this access, yet still enabling these processes, requires significant technical debt to address, and toil to maintain.
\n
Impact - The Platform network denies any access to the public internet, asides from the safe listed sites. - An exception process is required for ML packages/libraries/binaries that are not available in the safe listed repositories. - A full security scanning process is required for all developed containerised models on upload, pre-deployment, with error trapping and full audit trails.
\n
Implications - The Platform network acts as a security control, limiting the blast radius from any package issue. - This design acts as an attractive force for standardisation, encouraging the use of the languages supported by these safe listed repositories, i.e., Python. - Project Leads have an extended Responsible, Accountable, Consulted, and Informed (RACI), covering package management and usage within their workspace.
\n
Considerations - Fully Private Repository Approach – discounted due complexity and toil introduced from seeding and maintaining the repository, bespoke configuration updates required, and the lag introduced into the MLOps processes. - Complete serve-self model with open public internet access – discounted due to security risks introduced. - Web Application Firewall (WAF) based package inspection – discounted due to OPEX cost, ML language gaps and configuration complexity.
\n
\n
\n
Security
\n
\n
\n
\n
S1 - Secure SDLC implementation.
\n
\n
Decision - Aligning the platform design with an organisation's data classification under business ownership.
\n
Rational - A key benefit of an enterprise approach is to drive reuse and economies of scale, while reducing complexity and duplication. The appropriate data access control is the main challenge to this approach. Aligning the platform design with data classification should provide the most balanced approach.
\n
Impact - The Platform has multiple implementations of AML and related components. - Some levels of data duplication across implementations. - Enterprise and Department based AML implementations hosting multiple projects, therefore will be long standing implementations. - Project resources have access other project’s models/codebases within the same implementation.
\n
Implications - Business data owner accepts the uplifted RACI of AML implementation decision making.
\n
Considerations - Single enterprise implementation using AML project segregation – discounted based upon the lack of fine grain data access controls. - Each Project/model gets a separate AML implementation – discounted based upon complexity and cost.
\n
Callout - If AML security is uplifted to provide fine grain data, metadata, and configuration controls, this decision should be reviewed.
\n
\n
\n
S2 - Use Azure in-built roles.
\n
\n
Decision - In-build Azure Role Based Access Controls (RBAC) roles should be used. Custom roles should only be used on an exception basis, and proactively managed out.
\n
Rational - Custom RBAC roles require the customer to adopt a Product Owner role. The toil and cost across the full lifecycle doesn’t provide enough Return On Investment (ROI) to justify the commitment.
\n
Impact - Identity and Access Management (IAM) design is simplified. - Operational overhead, expense, and risk are reduced.
\n
Implications - Automation/compute processes may be introduced to provide a further layer of abstraction and control.
\n
Considerations - Custom Roles – discounted, due to the toil and cost across the full lifecycle.
\n
Callout - Microsoft is committed to consistently improving the security posture of its services and products.
\n
\n
\n
S3 - Security is balanced against cost and use case need.
\n
\n
Decision - The design balances security against cost and use case need.
\n
Rational - To provide an acceptable ROI, this platform must support a data science capability at reasonable cost.
\n
Impact - While the platform delivers an enterprise security baseline, component and control configuration beyond this level will be balance against cost, functionality and ways of working impact.
\n
Implications - Premium services that could provide the strongest security posture maybe be discounted based upon cost such as the use of confidential computing.
\n
Callout - Every customer is urged to review this KDD within their own specific constraints, and use case context.
Decision - This platform design algins with a \"Zero Trust\" security model.
\n
Rational - \"Zero Trust\" offers the highest level of security protection, as it removes implicit trust from services, components or people when interacting with the platform. Securing the service is a top priority NFR.
\n
Impact - All elements of the platform are secured using identities within a consistent RBAC framework, governed via central policies.
\n
Implications - No implicit trust is granted to any interactions behind the secure network perimeter. All Interactions and connectivity are enabled via explicit RBAC and policies.
\n
Considerations - Secure Network – discounted \"Zero Trust\" is additive.
\n
Callout - This approach aligns with Microsoft guidance for secure design.
\n
\n
\n
S5 - Reliance on Microsoft to secure services/components.
Rational - Customer Managed Keys (CMK) introduce toil, cost, and risk into the management and administration of the platform that only delivers a marginal uplift in security (depending on the maturity of the management process within the customer).
\n
Impact - Acceptance of the Microsoft process and standards for managing keys, certificates, and secrets.
\n
Considerations - CMK – discounted due the toil, cost and risk from this process.
\n
Callout - For projects using the highest classification of data, CMK maybe considered for the highest level of security. But this project implementation would be treated as an exception under this design.
\n
\n
\n
Service/Component Selection
\n
\n
\n
\n
C1 - Use Azure components.
\n
\n
Decision - The preference for component selection is (in order); 1. Azure native. 2. Azure first party. 3. Available via the Azure marketplace. 4. Other.
\n
Rational - This service selection preference provides the strongest support for platform integration, interoperability, and a consistent security baseline.
\n
Impact - All Azure native services and components are preferred.
\n
Implications - Components and services maybe discounted based upon their Azure status.
\n
Callout - Azure products and services evolve quickly, with feature hardened and uplift driven by customer feedback. Meaningful gaps are often quickly addressed.
\n
\n
\n
C2 - Cloud Services preference.
\n
\n
Decision - There is a strong preference for PaaS service selection.
\n
Rational - This decision reflects a cloud native design, reducing toil and risk from non-value add activities.
\n
Impact PaaS services are selected above others. Security design shifts from network and boundary controls to identity.
\n
Implications Above the line OPEX costs may appear higher than normal. Customers must accept the reduction in control, flexibility, and custom extension to services.
\n
Callout - True Total-Cost-of-Ownership (TCO) often contains a large factor of \"hidden costs\", due management and administration tasks carried out by a customer's resource pool. PaaS reduces this, at a cost.
\n
\n
\n
C3 - Reuse of Microsoft AI services.
\n
\n
Decision - Where appropriate, solutions reuse the AI services provided by Microsoft, rather than build bespoke/custom AI services.
\n
Rational - Microsoft is better placed to support the full Software Development Lifecycle (SDLC) of these services, reducing toil and risk for non-value add activities, along with lifecycle TCO.
\n
Impact The Platform network design must support the API interoperability required by Microsoft’s AI services. Individual solutions need API interoperability. Uplift in the support RACI for Data Science leads across the evolution of AI services, particularly for the currently used suite.
\n
Implications - Individual solutions could have one-to-many Microsoft AI services as subcomponents of that solution.
\n
Considerations - Bring-Your-Own/Custom solutions – discounted due to the RACI of the product ownership role across the full lifecycle.
\n
\n
\n
Software Development Lifecycle
\n
\n
\n
\n
D1 - Standing, Shared Test Environments.
\n
\n
Decision - The Staging and QA test environments remain standing, as a shared asset across the platform. To reduce cost, these environments should be stripped back, removing all model elements when not being used in a testing cycle.
\n
Rational - This approach enables greater reuse, speed-to-market, reduced complexity for setup and service interoperability.
\n
Impact - There must be an automated process to deploy, test, and strip back individual models, while leaving the testing workspaces and shared elements in place.
\n
Implications - Only compute processes have access to these test environments. - An automated test harness is required for Staging and QA.
\n
Considerations - Environments tore down post use – discounted based upon orchestration and implementation complexity introduced. - Each Project or model gets a separate Testing environment – discounted based upon cost.
\n
\n
\n
D2 - Access to Production assets to support iteration/uplift cycles.
\n
\n
Decision - Development is able to access production models, configuration, metadata and model data.
\n
Rational - Production data and code are a required input into the uplift and enhancement of an existing model.
\n
Impact - This access is temporary/elevated access to specific production assets controlled under an RBAC design. - Copies of production data will be created in the development data store.
\n
Implications - The Platform requires a \"fit for purpose\" data/asset catalog that is available to data scientists, providing transparency of current models and their performance. - Data scientists must have access to logging and monitoring details of productionised models to inform iteration cycles.
\n
Considerations - Open Development access - discounted due to security risks. - Development in Production – discounted due to the requirements of changing or update elements, along with ensuring compute and traffic segregation.
\n
Callout - Development activities often required the creation of test data, boundary use cases, skewing of values, etc. Synthetic test data can materially impact the quality/consistency of a model's outputs.
\n
\n
\n
D3 - Testing in Production.
\n
\n
Decision - The Staging and QA test environments are implemented in production, using production assets.
\n
Rational - A “Fit for purpose” testing baseline, especially for model iteration, requires current production datasets.
\n
Impact - Testing components have access to production data. - Reduction in toil for testing phases, greater accuracy in outcomes.
\n
Implications - RBAC & Identity implementation that clearly separates testing and productionised components.
\n
Considerations - Segregated Testing Environments – discounted based upon requirement for production data and the implementation cost and complexity introduced. - Each Project/model gets a separate Testing implementation – discounted based upon cost.
\n
Callout - Synthetic test data can materially impact the quality/consistency of a model's outputs.
\n
\n
\n
D4 - Automate toil away.
\n
\n
Decision - Where is there reuse and value, tasks should be automated.
\n
Rational - Automation increases service reliability, scale, compliance and security, reduce cost and risk, while enabling a greater focus on value-add tasks.
\n
Impact - Automation tooling covering the SDLC is required to support the platform.
\n
Implications - Resource capacity should be allocated to the maintenance and uplift of automation across the platform.
\n
Considerations - Automate everything, upfront – discounted due to lag and lack of direct business value delivered from this work.
\n
\n
\n
D5 - Implement an MLOps framework.
\n
\n
Decision - This platform design implements an MLOps framework to support the full SDLC lifecycle of ML models.
\n
Rational - An MLOps framework creates more efficient, less costly or risky workflows, increase scalability, collaboration, and model output quality, while reducing risk and errors.
\n
Impact - MLOps specific tooling is required to support the platform.
\n
Implications - Resource capacity should be allocated to the maintenance and uplift of MLOps capabilities and functions.
\n
Considerations - Implement DevOps - discounted due to specific requirements of ML lifecycle and the gaps such an approach would introduce. - Implement in a later phase – discounted due to the technical debt created.
Rational - This balances service resiliency with OPEX cost, and the low likelihood of a full regional outage.
\n
Impact - Data is replicated across each availability zone within the hosting region. - The Platform service will be impacted by a full outage in the hosting region.
\n
Implications - In the case of a full regional outage, the platform would be dependent upon Microsoft service recovery, as a prerequisite to its own service recovery.
\n
Considerations - Lower levels of redundancy – discounted due to the service resiliency requirements. - Higher levels of redundancy – discounted due to cost and low risk region failure.
\n
Callout - Microsoft hasn’t had a full regional outage (as at March 2024), although there are rare instances of key services going down, effectivity taking down regions.
\n
\n
\n
4. Design Overview
\n
\n
\n
4.1. Platform Logical Design
\n
\n
At a high level, the enterprise AML platform logical design can be illustrated as:
\n
\n
\n
\n
This AML design the completed ML model lifecycle, enabled by a MLOps framework.
\n
\n
\n
The platform is split across two environments, reflecting data access security requirements while enabling the iteration of existing productionized models.
\n
\n
\n
The design contains; - Share assets/components which all workspaces use, irrespective of data classification scope, that is, monitoring, deployment, testing workspaces, etc. - Foundation elements, which represent the enterprise implementation, intending to support many ML projects that have a data classification of general or lower. - Dept/Project Assets are either departments or individual solutions, reflecting the in-scope data classification, separated from the enterprise implementation.
\n
\n
\n
Microsoft’s cloud-based AI services and APIs are be available as a shared enterprise service. This approach simplifies the process of adding AI features and reducing cost and risk across the full product lifecycle from custom solutions.
\n
\n
\n
Both Enterprise and department implementations support one-many individual projects, therefore having a lifecycle outside of the individual projects. This design requires an uplifted RACI with nominated business owners of to manage/administer each implementation, ensuring tasks like project/data clean up, etc. are appropriately executed.
\n
\n
\n
For audit and iteration purposes, production generated data is immutable/append only. To enable development activities like test data creation, edge cases, etc. the development workspaces are able to create & update data as required.
\n
\n
\n
\n
\n
4.2. Azure Components/Services
\n
\n
Building on top of the Foundational elements, the following ML specific components would be added:
\n
\n
ML Services:
\n
\n
Azure Machine Learning (AML): Central hub for the machine learning experiments, datasets, and models, supporting the full ML model lifecycle.
\n
Azure ML Registry: organization-wide repository of machine learning assets such as models, environments, and components.
\n
Azure AI Services: out-of-the-box and customizable ML APIs, and models. These include services to support natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making. - AI Services includes Cognitive Services suite of ML services
Some Foundational elements would be extended to support the ML components, i.e. Azure Policies would be extended to cover ML component specific governance, ML components would be configured to ship logs to Azure Monitor – Log Analytics workspaces etc.
\n
\n
4.3. Design Assumptions and Constraints
\n
\n
\n
\n
Key Assumptions
\n
\n
\n
Each data source in scope has a clear Business owner who accepts the uplifted RACI of AML workspace decision maker.
\n
The existing Azure enterprise platform contains enterprise shared components, that this design can reuse. This includes ExpressRoutefor on-perm connectivity, Microsoft Entra ID for access and authentication, Sentinel for SEIM and SOAR, Defender for threat protection, etc.
\n
There's a \"fit for purpose\" Data governance application and process in-place, providing transparency, classification, and structure to data available across the eco-system.
\n
There's a \"fit for purpose\" CI/CD automation application, such as Azure DevOps, and infrastructure monitoring application, such as Azure Monitoring, in-place.
\n
The Data Scientists need access to a deployed model's full lineage to enable the future uplift iterations.
\n
The three safe listed ML package repositories contain ~80% of all required ML packages, libraries, and binaries needed across an enterprise ML capability. Therefore, the other 20% can be sourced using an exception process without introducing unacceptable lag, toil, or expense.
This design is generalized and doesn’t reflect any specific regulatory standard or ML model use case. Customers should considered their own requirements and context when considering this PoV.
\n
\n
\n
\n
4.4. Anti-Patterns
\n
\n
\n
\"Copy & Paste\" this design without considering individual context or requirements.
\n
Set & Forget implementations – Cloud services must be proactively monitored and managed.
\n
Not proactively managing cost.
\n
Not covering the full MLOps Lifecycle, including retirement of models.
\n
Business stakeholders who don’t understand or accept the Operating Model RACI.
\n
Embedding ML Project Leads without the time/priority to complete the addition tasks under the Operating Model RACI, that is, the break and fix support for the production model.
\n
Implementation of custom elements without understanding the full lifecycle and responsibilities of the \"Product Ownership\" role.
At a high level, this design can be illustrated as:
\n
\n
\n
\n
The key features of this network design are:
\n
\n
Private and Isolated Services with Virtual Network (VNet) Integration: VNet Integration of an AML workspace is required to bring the workspace onto the Azure Backbone. VNet Injection can be implemented via Private link and Private endpoints that secure AML resources and restrict all access within a private network. VNet integration is also used to isolate AML resources and control all inbound/outbound traffic. - An individual AML workspace uses multiple resources, such as Key Vault, Storage accounts, etc. This implementation requires the extension of the private endpoint configuration, securing all dependent resources ensuring a complete, unified secure design.
\n
Fine Grain Control via Network Security Groups (NSGs): NSGs are firewall-like constructs that define and enforce inbound and outbound network traffic rules at the subnet or network interface level. NSGs provide granular control over network traffic, enabling you to permit or deny specific protocols, ports, and IP addresses.
\n
Uplifted Boundary Protection via Distributed denial of service attacks (DDOS): Enabling Azure DDoS (distributed denial of service attacks) Protection Standard safeguards against distributed DDoS attacks.
\n
Private Connectivity with Express Route (ER): ExpressRoute provides a private and dedicated network connection between your on-premises network and Azure ML and other resources in Azure. It improves data transfer performance, enhances security, and ensures compliance with data privacy regulations.
\n
\n
\n
The complete network architecture can be illustrated as:
\n
\n
\n
\n
\n
\n
Important:
\n
\n
ML-assisted data labeling doesn't support default storage accounts that are secured behind a virtual network. You must use a non-default storage account for ML-assisted data labeling. The non-default storage account can be secured behind the virtual network.
\n
\n
\n
\n
5.1. ML Package Approach
\n
\n
The Problem Statement:
\n
\n
Data scientists often require large numbers of highly specialized packages, libraries or binaries as “building blocks” for ML solutions.
\n
Many of these packages are community developed, iterate with fast-paced development cycles, and required \"Subject Matter Expert\" (SME) knowledge to understand and use.
\n
Traditional approaches to software management for this requirement, often result in expensive, toil-filled processes, which act as a bottleneck on the delivery of value.
\n
\n
\n
Context:
\n
There are industry standard package repositories, typically aligned to programming language that serve the ML community for most requirements.
\n
\n
Approach:
\n
Safelist three industry standard ML package repositories, allowing self-serve from individual AML workspaces. Then, use an automated testing process during the deployment to scan the resulting solution containers. Failures would elegantly exit the deployment process and remove the container.
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Data scientists working within a specific AML workspace with network configuration applied, can self-serve ML packages on-demand from the whitelisted repositories. - An exception process is required for everything else, using the Private Storage pattern, seeded/maintained via a centralized function.
\n
AML delivers ML solutions as docker containers. As these solutions are developed, they are uploaded to the Azure Container Registry (ACR). Defender for Containers would be used to for the vulnerability scanning process.
\n
Solution deployment occurs via a CI/CD process. Defender for DevOps is used across the stack to provide security posture management and threat protection.
\n
Only if the solution container passes each of the security processes will it be deployed. Failure will result in the deployment elegantly exiting with error notifications, full audit trails and the solution container being discarded.
\n\n
\n
5.2. MVP Monitoring
\n
\n
The suggested MVP monitoring for this design is:
\n
\n
\n
5.2.1.1 - Model Performance – Data Drift
\n
\n
Description - Data drift tracks changes in the distribution of a model's input data by comparing it to the model's training data or recent past production data. Environment - Production. Implementation - AML – Model Monitoring. Notes - Data drift refactoring requires recent production datasets and outputs, to be available for comparison.
\n
\n
\n
5.2.1.2 - Model Performance – Usage
\n
\n
Description - Several model serving endpoint metrics to indicate quality and performance. Environment - All. Implementation - Azure Monitor AML metrics. Notes - This table has the supporting information to identify the AML workspace, deployment etc.
\n
\n
\n
5.2.1.3 - Model Performance – Prediction Drift
\n
\n
Description - Prediction drift tracks changes in the distribution of a model's prediction outputs by comparing it to validation or test labeled data or recent past production data. Environment - Production. Implementation - Azure Monitor AML metrics. Notes - Prediction drift refactoring requires recent production datasets and outputs, to be available for comparison.
\n
\n
\n
5.2.2.1 - Usage - Client Requests
\n
\n
Description - Count of the Client Requests to the model endpoint. Environment - Production. Implementation; - Machine Learning Services - OnlineEndpoints. - Count of RequestPerMintute. Notes - Acceptable thresholds could be aligned to t-shirt sizing’s or anomalies (acknowledging the need to establish a baseline). - When a model is no longer being used, it should be retired from production.
\n
\n
\n
5.2.2.2 - Usage - Throttling Delays
\n
\n
Description - Throttling Delays in request and response in data transfer. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Sum of RequestThrottlingDelayMs. - ResponseThrottlingDelayMs. Notes - Acceptable thresholds should be aligned service's \"Service Level Agreement\" (SLA) and the solution's non-functional requirements (NFRs).
\n
\n
\n
5.2.2.3 - Usage - Errors Generated
\n
\n
Description - Response Code - Errors generated. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Count of XRequestId by ModelStatusCode. - Count of XRequestId by ModelStatusCode & ModelStatusReason. Notes - All HTTP responses codes in the 400 & 500 range would be classified as an error.
\n
\n
\n
5.2.3 - Budget Boundaries
\n
\n
Description - When monthly Operating expenses (OPEX), based on usage or cost, reaches or exceeds a predefined amount. Environment - All. Implementation - Azure – Budget Alerts. Notes; - Budget thresholds should be set based upon the initial NFR’s and cost estimates. - Multiple threshold tiers should be used, ensuring stakeholders get appropriate warning before the budget is exceeded. - Consistent budget alerts could also be a trigger for refactoring to support greater demand.
\n
\n
\n
5.2.4 - Workspace – Staleness
\n
\n
Description - When an AML workspace no longer appears to have active use. Environment - Development. Implementation; - Azure Monitor AML metrics; - Machine Learning Services - Workspaces - count of Active Cores over a period. Notes; - Active Cores should equal zero with aggregation of count. - Date thresholds should be aligned to the project schedule.
\n
\n
\n
5.2.5 - Security Controls inc. RBAC
\n
\n
Description - Ensuring the appropriate security controls and baseline are implemented and not deviated from. Environment - All. Implementation; - Azure – Policies. - Including the “Audit usage of custom RBAC roles”. Notes;. - The full listing of available in-built policies is available for AML. - Other components/services used in this design should also have their specific in-built policies reviewed and implemented where appropriate.
\n
\n
\n
5.2.6 - Deployment – Standards/Governance
\n
\n
Description - Ensuring the appropriate standards and guardrails are adhered too. Environment - Azure & CI/CD. Implementation; - Azure – DevOps Pipelines. - PSRule for Azure. - Enterprise Policy As Code (EPAC) (azure.github.io). Notes; - PSRule provides a testing framework for Azure Infrastructure as Code (IaC). - EPAC can be used in CI/CD based system deploy Policies, Policy Sets, Assignments, Policy Exemptions and Role Assignments. - Microsoft guidance is available in the Azure guidance for AML regulatory compliance.
\n
\n
\n
5.2.7 - Deployment – Security Scanning
\n
\n
Description - Automated security scanning is executed as part of the automated integration and deployment processes. Environment - CI/CD. Implementation - Azure – Defender For DevOps. Notes - This processes can be extended with Azure marketplace for 3rd party security testing modules.
\n
\n
\n
5.2.8 - Model – Endpoint Security
\n
\n
Description - Targeted security monitoring of any AML endpoint. Environment - All. Implementation - Azure – Defender For APIs.
\n
\n
\n
5.2.9 - Development – Ongoing service
\n
\n
Description - A development model appearing provide a regular service that should be productionised. Environment - Development. Implementation; - Azure Monitor AML metrics. - AMLOnlineEndpointTrafficLog - count of XMSClientRequestId over a month. Notes - Date thresholds should be aligned to the project schedule.
\n
\n
\n
Important:
\n
Several of the implementations are in Preview (as at Mar ‘24), please refer to Preview Terms Of Use for greater detail.
\n
\n
6. Security
\n
\n
6.1. SDLC Access Patterns
\n
\n
The Access patterns required to support the full Software Development Lifecycle (SDLC) can be illustrated as:
System/compute access to components/services is based upon identity, with Managed identities being preferred due to the strong security posture.
\n
Individuals access to components/services and data are based upon their Microsoft Entra ID identity, and its Azure – RBAC group membership. - The design will use Azure defined RBAC roles over custom roles due to the reduced operating toil and risk of keeping custom roles up-to-date.
\n
Access patterns can be aligned to the SDLC phase; - Development - the access required to support the analysis, development, and initial testing of ML models. The access required by a new implementation is a subset of the access requirement for the iteration of an existing solution. - Testing - temporary access required to support the deployment and Quality Assurance (QA) model testing as a prerequisite to production release. - Production – the access required by a productionize ML model, released via an Azure AML endpoint to downstream consumers.
\n
Azure AI Services APIs are available to development processes as part of the enterprise shared service. Once the model is productionized, a workspace specific implementation of that API is used.
\n
Depending on the individual solution's non functional requirements (NFRs), serving a model via an AML endpoint may not be appropriate. Other services, such as App Service, Azure Kubernetes Service (AKS), etc., could be considerd. But these requirements are Out-of-scope for this PoV.
\n
\n
\n
6.2. Identity RBAC – Personas
\n
\n
This design considers the following Persona’s to inform the identity-based RBAC group design:
\n
\n
\n
R1 - Data Scientist/ML Engineer
\n
\n
Description - The people doing the various ML and data science activities across the SLDC lifecycle for a project. This role's responsibilies include break and fix activities for the ML models, packages, and data, which sit outside of platform support expertise. Type - Person. Project Specific - Yes. Notes - Involves data exploration and preprocessing to model training, evaluation, and deployment, to solve complex business problems and generate insight.
\n
\n
\n
R2 - Data Analyst
\n
\n
Description - The people doing the data analyst tasks required as an input to data science activities. Type - Person. Project Specific - Yes. Notes - This role involves working with data, performing analysis, and supporting model development and deployment activities.
\n
\n
\n
R3 - Model Tester
\n
\n
Description - The compute process used in Staging & QA testing. Type - Person. Project Specific - Yes. Notes - This role provides functional segregation from the CI/CD processes.
\n
\n
\n
R4 - Business Stakeholders
\n
\n
Description - Business stakeholders attached to the project. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace components in development.
\n
\n
\n
R5 - Project Lead (Data Science Lead)
\n
\n
Description - The Data Science lead in a project administration role for the AML workspace. Type - Person. Project Specific - Yes. Notes - This role would also have break/fix responsibility for the ML models and packages used.
\n
\n
\n
R6 - Project Owner (Bus Owner)
\n
\n
Description - The Business stakeholders responsible for the AML workspace based upon data ownership. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace configuration and components in development. Production coverage will be provided by the data governance application.
\n
\n
\n
R7 - Platform Technical Support
\n
\n
Description - The Technical support staff responsible for break/fix activities across the platform. This role would cover infrastructure, service, etc. But not the ML models, packages or data. These elements remain under the Data Scientist/ML Engineer role's responsibility. Type - Person. Project Specific - No. Notes - While the role group is permanent, membership is only transient, based upon a Privileged Identity Management (PIM) process for time boxed, evaluated access.
\n
\n
\n
R8 - Model End User
\n
\n
Description - The End consumers of the ML Model. This role could be a downstream process or an individual. Type - Person and Process. Project Specific - Yes.
\n
\n
\n
R9 - CI/CD processes
\n
\n
Description - The compute processes that releases/rolls back change across the platform environments. Type - Process. Project Specific - No.
\n
\n
\n
R10 - AML Workspace
\n
\n
Description - The managed identities used by an AML workspace to interact with other parts of Azure. Type - Person. Project Specific - No. Notes - This persona represents the various services that make up an AML implementation, which interact with other parts of the platform, such as, the development workspace connecting with the development data store, etc.
\n
\n
\n
R11 - Monitoring Processes
\n
\n
Description - The compute processes which monitor & alert based upon platform activities. Type - Process. Project Specific - No.
\n
\n
\n
R12 - Data Governance Processes
\n
\n
Description - The compute process that scans the ML project and datastores for data governance. Type - Process. Project Specific - No.
\n
\n
6.3. Identity RBAC – Control Plane
\n
\n
The Control plane is used to manage the resource level objects with a subscription.
\n
\n
The Persona based identity RBAC design for the control plane for each environment can be described as;
\n
\n
\n
Production:
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Development:
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. LAR = Log Analytics Reader. LAC = Log Analytics Contributor. MR = Monitoring Reader. MC = Monitoring Contributor.
\n
\n
\n
\n
Important:
\n
Once a model has been productionized using one or more Azure AI Services API’s, service specific built-in roles should be implemented into that project.
\n
\n
6.4. Identity RBAC – Data/Model Plane
\n
\n
The Data plane is used to manage the capabilities exposed by a resource.
\n
\n
The Persona based identity RBAC design for the data plane for each environment can be described as;
\n
\n
Production:
\n
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Development:
\n
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. KVA = Key Vault Administrator. KVA = Key Vault Administrator.
\n
\n
\n
Important:
\n
\n
Data plane controls are additive to the Control plane, i.e. they build on top of them.
\n
The Data plane controls vary depending on the specific AI Service selected, its recommended to take to most restrictive scope matched with the most appropriate built-in role available for the role/task requirements.
\n
\n
\n
7. SDLC Flow
\n
\n
This section describes the full Software Development Lifecycle (SDLC) for a departmental ML model.
\n
\n
A Departmental ML model development describes the most detailed work-through of the process. An Enterprise process is a simplified version of this process.
\n
\n
\n
7.1. Step 1 – Create Development
\n
\n
For a new development, the first step is to create the development environment with the various AML components required and develop the initial version of the ML model.
\n
\n
Prerequisites
\n
\n
Assess the in-scope data, validating the reuse of the Enterprise or an existing Department implementation.
\n
Confirm the Project Lead and Business owner roles, and validate understanding/acceptance of the Responsible, Accountable, Consulted, and Informed (RACI).
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Create the Department related development Entra ID groups as described on the identity RBAC section.
\n
From deployment templates, create the AML workspace and data storage components in the development environment, linking together with compute identities. - This deployment includes linking to the production instance of the enterprise shared Microsoft's AI service API’s suite. - Tagging of components/services is key to driving policies, monitoring, and cost attribution.
\n
From deployment templates, create the AML data store in the development environment. - This approach enables the workspace users to create, alter, or update data as required to support the development process.
\n
Enable the Workspace compute managed identities to access the data storage.
\n
Update the Monitoring and Alerting rules for a new department workspace in the development environment, as per the MVP Monitoringsection.
\n\n
From this baseline, the project team is able to start ML development activities.
\n
\n
Important:
\n
This worked example is for a new Dept setup, but the same process would apply for the initial Enterprise or individual project setups.
\n
\n
7.2. Step 2 – Push to testing
\n
\n
Once the model completes the initial testing phases, it should progress through Quality Assurance (QA) testing. If testing is failed, this process would exit with alerting back to the project. The new model elements would be removed, enabled access backed out, and process logs made available for trouble-shooting.
\n
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, the model, configuration and metadata are \"pulled\" into the deployment pipeline.
\n
Update the Monitoring and Alerting rules for a new model entering the testing phase, as per the MVP Monitoring section.
\n
Model data (if necessary) is populated into the production data to support the testing tasks.
\n
The Shared Staging workspace is updated for the new model deployment and components are stood-up to complete model/manifest deployment testing.
\n
Once staging has completed, the Shared QA workspace is updated for the new model deployment. QA Components are stood-up to complete integration, performance & volume, and security testing, etc. - This phase of testing will be extended over time as individual projects extend the QA testing harness.
\n
All audit & testing logs are made available back to the project team.
\n\n
\n
7.3. Step 3 – Release to Production
\n
\n
Once the model completes QA testing, it would be deployed into production. Process failure would trigger a support incident, in addition to the failure attributes as described for Step 2.
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Create the Department related production Entra ID groups as described on the identity RBAC section.
\n
Removing the model and data components from the Staging and QA workspaces.
\n
From deployment templates, create the department specific data store in the production immutable data store, tagged appropriately.
\n
From deployment templates, create the department specific AML production workspace using its managed identities connect to the data store.
\n
From deployment templates, link to the department specific Azure AI Services (for the subset of required services) via the AML production workspace – managed identity.
\n
From deployment templates, create the department ML repository in production using its managed identity connect to the AML workspace and the data store.
\n
Deploy the production workspace endpoint, enabling downstream processes or individuals to access/interact with the model. - Depending upon the desired Service Level Agreement (SLA) or Non Functional Requirements (NFRs), other model serving methods maybe appropriate such as Web Apps, Azure Kubernetes Service (AKS) etc. These options aren’t covered in this PoV.
\n
Update the Monitoring and Alerting rules for a new model entering production, as per the MVP Monitoring section.
\n\n
\n
7.4. Step 4 – Iteration
\n
\n
A Productionized model requires iterative development to ensure it remains \"fit for purpose\", addressing either data or prediction drift. This iterative process is the next step in the model development lifecycle.
\n
\n
Prerequisites
\n
\n
Signals from the production model process demonstrating a degradation in performance, output, cost, etc.
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Depending on timing, the development workspace may have been removed from the environment. If so, a new development deployment would be required following the Step 1 process.
\n
From the Production ML repository, copy across the current version model, configuration, metadata, logs, etc. providing the baseline to work from and inform the iteration refactoring activities.
\n
From the Immutable production data store, copy across the existing model’s datasets and register them for use in the deployment workspace - Depending on the scope/context of the work, this connection maybe a one-off or periodically required to get the latest updates. - The replication of data enables developers and testers to create or update data as required, without impacting the \"golden record\". - Other non-ML datasets would be ingested at this stage, if needed.
\n\n
\n
From this baseline, the project team is able to start the refactoring activities.
\n
7.5. Step 5 – Iteration Testing
\n
\n
As before, once the model iteration completes initial testing, it should progress through quality assurance testing. This process follows the process from Step 2 with the addition of ML Repository component.
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, the model, configuration and metadata are \"pulled\" into the deployment pipeline.
\n
The Department ML Repository is populated for the iterative deployment.
\n
The Enterprise Staging workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
\n
Staging Components are stood-up to complete model/manifest deployment testing.
\n
The Enterprise QA workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
\n
QA Components are stood-up to complete integration, Performance & volume, and security testing.
\n\n
\n
Once completed, the iterative model would be versioned and then released to production, following the process from Step 3.
\n
\n
7.6. Step 6 – Retirement
\n
\n
When a model has been replaced, depreciated or no longer delivers business value, it should be removed from the environment. For completeness, the process of removing a department installation is described here. An individual Model retirement would be a subset of these steps.
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, shut down the model serving endpoint, taking the model effectivity offline. - This approach \"smoke tests\" the removal, uncovering any hidden dependant solutions or processes.
\n
Removing the Department/model specific monitoring and alerting rules, false positives aren’t raised during this process.
\n
Removing the Department development workspace and related identities.
\n
Removing the Department development data store and data.
\n
Upload copies of the model, configuration, and metadata, to an archive, if necessary.
\n
Removing the Department ML repository, production workspace components and related identities.
\n
Removing the Department production data store. Data could also be transitioned to a cooler service tier, if long term retention is a requirement.
\n
Removing the Department specific Entra ID groups and identities.
Many Organisations want to create enterprise data science capability. The goals can include unlocking value from their data assets, reducing cost, and driving customer engagement. While many organisations have an initial capability, challenges can arise while \"scaling and industrialization\" into an enterprise service. This Point-of-view provides an opinionated design for a \"fit for purpose\" enterprise data science platform, delivered with Azure Machine Learning. It covers infrastructure, identity, data and functionality, aligned to an MLOps delivery framework.
\n
\n
2. Use Case Definition
\n
\n
The following use case is used to help define the scope of this PoV design.
\n
This design:
\n
\n
\n
Is for a fictitious mid-level enterprise, wanting to mature its data science function. The key goal is too standup an enterprise-ready platform that can support the 20 different projects, executing data science work packages. - The initial work package is a basic statistical model for consumption by internal resources.
\n
\n
\n
Is for a solution that MUST deliver the following capabilities: - Support of an MLOps function - Enablement of innovation work
\n
\n
\n
Has the following key Non Functional Requirements (NFRs) in order of importance: 1. Security 2. Cost Optimisation 3. System Governance 4. Supportability
\n
\n
\n
Azure Machine Learning (AML). AML was selected due to the firm’s existing Microsoft footprint, skills and capabilities, the desire to lower the toil/risk from integration and interoperability, and the easy of scaling delivery when utilizing Microsoft tooling.
\n
\n
3. The Key Design Decisions (KDD)
\n
\n
\n
Networking
\n
\n
\n
\n
N1 - Network access design
\n
\n
Decision - The use of Private endpoints (where available) are used to secure all egress/ingress of data.
\n
Rational - Securing the service is the highest priority NFRs. Private endpoints (PE) provide the highest level of security for data transfer.
\n
Impact - Solution endpoints are only available to defined, Azure services. They are non-addressable by anything else. - Increased solution Operating Expense (OPEX). - Increased initial configuration work for routing setup.
\n
Implications - Endpoints that do not offer PE compatibility need to be either blocked, or otherwise hardened. - New Services maybe rejected based upon their lack of PE support (or similar controls) that is, preview or beta versions.
\n
Considerations - Unsecured endpoints with Application native controls – discounted based upon security NFRs.
\n
\n
\n
N2 - The network design to secure the service.
\n
\n
Decision - Removing the Network jump boxes from the design.
\n
Rational - The Network jump boxes are excluded from the design, based upon cost and the acceptable security baseline already provided.
\n
Impact - Decreased solution OPEX and complexity.
\n
Implications - Users interact with the platform either via the portal, IDEs or command prompt/CLI.
\n
Considerations - Implement Azure Bastion – discounted due to cost.
\n
\n
\n
N3 - Safe listing key public ML package repositories.
\n
\n
Decision The following ML repositories are safe listed for the Platform, enabling data scientists to self-serve ML packages and libraries; - PyPI · The Python Package Index. - conda-forge - Microsoft Artifact Registry Outside of this, access to the public internet the platform is blocked.
\n
Rational - This decision balances the requirement for specialized ML packages and libraries as a prerequisite to delivering value, while protecting the platform from the risks of open-source codebases. - Elements of AML, such as environment builds, require specific ML packages which by default access these repositories. Blocking this access, yet still enabling these processes, requires significant technical debt to address, and toil to maintain.
\n
Impact - The Platform network denies any access to the public internet, asides from the safe listed sites. - An exception process is required for ML packages/libraries/binaries that are not available in the safe listed repositories. - A full security scanning process is required for all developed containerised models on upload, pre-deployment, with error trapping and full audit trails.
\n
Implications - The Platform network acts as a security control, limiting the blast radius from any package issue. - This design acts as an attractive force for standardisation, encouraging the use of the languages supported by these safe listed repositories, i.e., Python. - Project Leads have an extended Responsible, Accountable, Consulted, and Informed (RACI), covering package management and usage within their workspace.
\n
Considerations - Fully Private Repository Approach – discounted due complexity and toil introduced from seeding and maintaining the repository, bespoke configuration updates required, and the lag introduced into the MLOps processes. - Complete serve-self model with open public internet access – discounted due to security risks introduced. - Web Application Firewall (WAF) based package inspection – discounted due to OPEX cost, ML language gaps and configuration complexity.
\n
\n
\n
Security
\n
\n
\n
\n
S1 - Secure SDLC implementation.
\n
\n
Decision - Aligning the platform design with an organisation's data classification under business ownership.
\n
Rational - A key benefit of an enterprise approach is to drive reuse and economies of scale, while reducing complexity and duplication. The appropriate data access control is the main challenge to this approach. Aligning the platform design with data classification should provide the most balanced approach.
\n
Impact - The Platform has multiple implementations of AML and related components. - Some levels of data duplication across implementations. - Enterprise and Department based AML implementations hosting multiple projects, therefore will be long standing implementations. - Project resources have access other project’s models/codebases within the same implementation.
\n
Implications - Business data owner accepts the uplifted RACI of AML implementation decision making.
\n
Considerations - Single enterprise implementation using AML project segregation – discounted based upon the lack of fine grain data access controls. - Each Project/model gets a separate AML implementation – discounted based upon complexity and cost.
\n
Callout - If AML security is uplifted to provide fine grain data, metadata, and configuration controls, this decision should be reviewed.
\n
\n
\n
S2 - Use Azure in-built roles.
\n
\n
Decision - In-build Azure Role Based Access Controls (RBAC) roles should be used. Custom roles should only be used on an exception basis, and proactively managed out.
\n
Rational - Custom RBAC roles require the customer to adopt a Product Owner role. The toil and cost across the full lifecycle doesn’t provide enough Return On Investment (ROI) to justify the commitment.
\n
Impact - Identity and Access Management (IAM) design is simplified. - Operational overhead, expense, and risk are reduced.
\n
Implications - Automation/compute processes may be introduced to provide a further layer of abstraction and control.
\n
Considerations - Custom Roles – discounted, due to the toil and cost across the full lifecycle.
\n
Callout - Microsoft is committed to consistently improving the security posture of its services and products.
\n
\n
\n
S3 - Security is balanced against cost and use case need.
\n
\n
Decision - The design balances security against cost and use case need.
\n
Rational - To provide an acceptable ROI, this platform must support a data science capability at reasonable cost.
\n
Impact - While the platform delivers an enterprise security baseline, component and control configuration beyond this level will be balance against cost, functionality and ways of working impact.
\n
Implications - Premium services that could provide the strongest security posture maybe be discounted based upon cost such as the use of confidential computing.
\n
Callout - Every customer is urged to review this KDD within their own specific constraints, and use case context.
Decision - This platform design algins with a \"Zero Trust\" security model.
\n
Rational - \"Zero Trust\" offers the highest level of security protection, as it removes implicit trust from services, components or people when interacting with the platform. Securing the service is a top priority NFR.
\n
Impact - All elements of the platform are secured using identities within a consistent RBAC framework, governed via central policies.
\n
Implications - No implicit trust is granted to any interactions behind the secure network perimeter. All Interactions and connectivity are enabled via explicit RBAC and policies.
\n
Considerations - Secure Network – discounted \"Zero Trust\" is additive.
\n
Callout - This approach aligns with Microsoft guidance for secure design.
\n
\n
\n
S5 - Reliance on Microsoft to secure services/components.
Rational - Customer Managed Keys (CMK) introduce toil, cost, and risk into the management and administration of the platform that only delivers a marginal uplift in security (depending on the maturity of the management process within the customer).
\n
Impact - Acceptance of the Microsoft process and standards for managing keys, certificates, and secrets.
\n
Considerations - CMK – discounted due the toil, cost and risk from this process.
\n
Callout - For projects using the highest classification of data, CMK maybe considered for the highest level of security. But this project implementation would be treated as an exception under this design.
\n
\n
\n
Service/Component Selection
\n
\n
\n
\n
C1 - Use Azure components.
\n
\n
Decision - The preference for component selection is (in order); 1. Azure native. 2. Azure first party. 3. Available via the Azure marketplace. 4. Other.
\n
Rational - This service selection preference provides the strongest support for platform integration, interoperability, and a consistent security baseline.
\n
Impact - All Azure native services and components are preferred.
\n
Implications - Components and services maybe discounted based upon their Azure status.
\n
Callout - Azure products and services evolve quickly, with feature hardened and uplift driven by customer feedback. Meaningful gaps are often quickly addressed.
\n
\n
\n
C2 - Cloud Services preference.
\n
\n
Decision - There is a strong preference for PaaS service selection.
\n
Rational - This decision reflects a cloud native design, reducing toil and risk from non-value add activities.
\n
Impact PaaS services are selected above others. Security design shifts from network and boundary controls to identity.
\n
Implications Above the line OPEX costs may appear higher than normal. Customers must accept the reduction in control, flexibility, and custom extension to services.
\n
Callout - True Total-Cost-of-Ownership (TCO) often contains a large factor of \"hidden costs\", due management and administration tasks carried out by a customer's resource pool. PaaS reduces this, at a cost.
\n
\n
\n
C3 - Reuse of Microsoft AI services.
\n
\n
Decision - Where appropriate, solutions reuse the AI services provided by Microsoft, rather than build bespoke/custom AI services.
\n
Rational - Microsoft is better placed to support the full Software Development Lifecycle (SDLC) of these services, reducing toil and risk for non-value add activities, along with lifecycle TCO.
\n
Impact The Platform network design must support the API interoperability required by Microsoft’s AI services. Individual solutions need API interoperability. Uplift in the support RACI for Data Science leads across the evolution of AI services, particularly for the currently used suite.
\n
Implications - Individual solutions could have one-to-many Microsoft AI services as subcomponents of that solution.
\n
Considerations - Bring-Your-Own/Custom solutions – discounted due to the RACI of the product ownership role across the full lifecycle.
\n
\n
\n
Software Development Lifecycle
\n
\n
\n
\n
D1 - Standing, Shared Test Environments.
\n
\n
Decision - The Staging and QA test environments remain standing, as a shared asset across the platform. To reduce cost, these environments should be stripped back, removing all model elements when not being used in a testing cycle.
\n
Rational - This approach enables greater reuse, speed-to-market, reduced complexity for setup and service interoperability.
\n
Impact - There must be an automated process to deploy, test, and strip back individual models, while leaving the testing workspaces and shared elements in place.
\n
Implications - Only compute processes have access to these test environments. - An automated test harness is required for Staging and QA.
\n
Considerations - Environments tore down post use – discounted based upon orchestration and implementation complexity introduced. - Each Project or model gets a separate Testing environment – discounted based upon cost.
\n
\n
\n
D2 - Access to Production assets to support iteration/uplift cycles.
\n
\n
Decision - Development is able to access production models, configuration, metadata and model data.
\n
Rational - Production data and code are a required input into the uplift and enhancement of an existing model.
\n
Impact - This access is temporary/elevated access to specific production assets controlled under an RBAC design. - Copies of production data will be created in the development data store.
\n
Implications - The Platform requires a \"fit for purpose\" data/asset catalog that is available to data scientists, providing transparency of current models and their performance. - Data scientists must have access to logging and monitoring details of productionised models to inform iteration cycles.
\n
Considerations - Open Development access - discounted due to security risks. - Development in Production – discounted due to the requirements of changing or update elements, along with ensuring compute and traffic segregation.
\n
Callout - Development activities often required the creation of test data, boundary use cases, skewing of values, etc. Synthetic test data can materially impact the quality/consistency of a model's outputs.
\n
\n
\n
D3 - Testing in Production.
\n
\n
Decision - The Staging and QA test environments are implemented in production, using production assets.
\n
Rational - A “Fit for purpose” testing baseline, especially for model iteration, requires current production datasets.
\n
Impact - Testing components have access to production data. - Reduction in toil for testing phases, greater accuracy in outcomes.
\n
Implications - RBAC & Identity implementation that clearly separates testing and productionised components.
\n
Considerations - Segregated Testing Environments – discounted based upon requirement for production data and the implementation cost and complexity introduced. - Each Project/model gets a separate Testing implementation – discounted based upon cost.
\n
Callout - Synthetic test data can materially impact the quality/consistency of a model's outputs.
\n
\n
\n
D4 - Automate toil away.
\n
\n
Decision - Where is there reuse and value, tasks should be automated.
\n
Rational - Automation increases service reliability, scale, compliance and security, reduce cost and risk, while enabling a greater focus on value-add tasks.
\n
Impact - Automation tooling covering the SDLC is required to support the platform.
\n
Implications - Resource capacity should be allocated to the maintenance and uplift of automation across the platform.
\n
Considerations - Automate everything, upfront – discounted due to lag and lack of direct business value delivered from this work.
\n
\n
\n
D5 - Implement an MLOps framework.
\n
\n
Decision - This platform design implements an MLOps framework to support the full SDLC lifecycle of ML models.
\n
Rational - An MLOps framework creates more efficient, less costly or risky workflows, increase scalability, collaboration, and model output quality, while reducing risk and errors.
\n
Impact - MLOps specific tooling is required to support the platform.
\n
Implications - Resource capacity should be allocated to the maintenance and uplift of MLOps capabilities and functions.
\n
Considerations - Implement DevOps - discounted due to specific requirements of ML lifecycle and the gaps such an approach would introduce. - Implement in a later phase – discounted due to the technical debt created.
Rational - This balances service resiliency with OPEX cost, and the low likelihood of a full regional outage.
\n
Impact - Data is replicated across each availability zone within the hosting region. - The Platform service will be impacted by a full outage in the hosting region.
\n
Implications - In the case of a full regional outage, the platform would be dependent upon Microsoft service recovery, as a prerequisite to its own service recovery.
\n
Considerations - Lower levels of redundancy – discounted due to the service resiliency requirements. - Higher levels of redundancy – discounted due to cost and low risk region failure.
\n
Callout - Microsoft hasn’t had a full regional outage (as at March 2024), although there are rare instances of key services going down, effectivity taking down regions.
\n
\n
\n
4. Design Overview
\n
\n
\n
4.1. Platform Logical Design
\n
\n
At a high level, the enterprise AML platform logical design can be illustrated as:
\n
\n
\n
\n
This AML design the completed ML model lifecycle, enabled by a MLOps framework.
\n
\n
\n
The platform is split across two environments, reflecting data access security requirements while enabling the iteration of existing productionized models.
\n
\n
\n
The design contains; - Share assets/components which all workspaces use, irrespective of data classification scope, that is, monitoring, deployment, testing workspaces, etc. - Foundation elements, which represent the enterprise implementation, intending to support many ML projects that have a data classification of general or lower. - Dept/Project Assets are either departments or individual solutions, reflecting the in-scope data classification, separated from the enterprise implementation.
\n
\n
\n
Microsoft’s cloud-based AI services and APIs are be available as a shared enterprise service. This approach simplifies the process of adding AI features and reducing cost and risk across the full product lifecycle from custom solutions.
\n
\n
\n
Both Enterprise and department implementations support one-many individual projects, therefore having a lifecycle outside of the individual projects. This design requires an uplifted RACI with nominated business owners of to manage/administer each implementation, ensuring tasks like project/data clean up, etc. are appropriately executed.
\n
\n
\n
For audit and iteration purposes, production generated data is immutable/append only. To enable development activities like test data creation, edge cases, etc. the development workspaces are able to create & update data as required.
\n
\n
\n
\n
\n
4.2. Azure Components/Services
\n
\n
Building on top of the Foundational elements, the following ML specific components would be added:
\n
\n
ML Services:
\n
\n
Azure Machine Learning (AML): Central hub for the machine learning experiments, datasets, and models, supporting the full ML model lifecycle.
\n
Azure ML Registry: organization-wide repository of machine learning assets such as models, environments, and components.
\n
Azure AI Services: out-of-the-box and customizable ML APIs, and models. These include services to support natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making. - AI Services includes Cognitive Services suite of ML services
Some Foundational elements would be extended to support the ML components, i.e. Azure Policies would be extended to cover ML component specific governance, ML components would be configured to ship logs to Azure Monitor – Log Analytics workspaces etc.
\n
\n
4.3. Design Assumptions and Constraints
\n
\n
\n
\n
Key Assumptions
\n
\n
\n
Each data source in scope has a clear Business owner who accepts the uplifted RACI of AML workspace decision maker.
\n
The existing Azure enterprise platform contains enterprise shared components, that this design can reuse. This includes ExpressRoutefor on-perm connectivity, Microsoft Entra ID for access and authentication, Sentinel for SEIM and SOAR, Defender for threat protection, etc.
\n
There's a \"fit for purpose\" Data governance application and process in-place, providing transparency, classification, and structure to data available across the eco-system.
\n
There's a \"fit for purpose\" CI/CD automation application, such as Azure DevOps, and infrastructure monitoring application, such as Azure Monitoring, in-place.
\n
The Data Scientists need access to a deployed model's full lineage to enable the future uplift iterations.
\n
The three safe listed ML package repositories contain ~80% of all required ML packages, libraries, and binaries needed across an enterprise ML capability. Therefore, the other 20% can be sourced using an exception process without introducing unacceptable lag, toil, or expense.
This design is generalized and doesn’t reflect any specific regulatory standard or ML model use case. Customers should considered their own requirements and context when considering this PoV.
\n
\n
\n
\n
4.4. Anti-Patterns
\n
\n
\n
\"Copy & Paste\" this design without considering individual context or requirements.
\n
Set & Forget implementations – Cloud services must be proactively monitored and managed.
\n
Not proactively managing cost.
\n
Not covering the full MLOps Lifecycle, including retirement of models.
\n
Business stakeholders who don’t understand or accept the Operating Model RACI.
\n
Embedding ML Project Leads without the time/priority to complete the addition tasks under the Operating Model RACI, that is, the break and fix support for the production model.
\n
Implementation of custom elements without understanding the full lifecycle and responsibilities of the \"Product Ownership\" role.
At a high level, this design can be illustrated as:
\n
\n
\n
\n
The key features of this network design are:
\n
\n
Private and Isolated Services with Virtual Network (VNet) Integration: VNet Integration of an AML workspace is required to bring the workspace onto the Azure Backbone. VNet Injection can be implemented via Private link and Private endpoints that secure AML resources and restrict all access within a private network. VNet integration is also used to isolate AML resources and control all inbound/outbound traffic. - An individual AML workspace uses multiple resources, such as Key Vault, Storage accounts, etc. This implementation requires the extension of the private endpoint configuration, securing all dependent resources ensuring a complete, unified secure design.
\n
Fine Grain Control via Network Security Groups (NSGs): NSGs are firewall-like constructs that define and enforce inbound and outbound network traffic rules at the subnet or network interface level. NSGs provide granular control over network traffic, enabling you to permit or deny specific protocols, ports, and IP addresses.
\n
Uplifted Boundary Protection via Distributed denial of service attacks (DDOS): Enabling Azure DDoS (distributed denial of service attacks) Protection Standard safeguards against distributed DDoS attacks.
\n
Private Connectivity with Express Route (ER): ExpressRoute provides a private and dedicated network connection between your on-premises network and Azure ML and other resources in Azure. It improves data transfer performance, enhances security, and ensures compliance with data privacy regulations.
\n
\n
\n
The complete network architecture can be illustrated as:
\n
\n
\n
\n
\n
\n
Important:
\n
\n
ML-assisted data labeling doesn't support default storage accounts that are secured behind a virtual network. You must use a non-default storage account for ML-assisted data labeling. The non-default storage account can be secured behind the virtual network.
\n
\n
\n
\n
5.1. ML Package Approach
\n
\n
The Problem Statement:
\n
\n
Data scientists often require large numbers of highly specialized packages, libraries or binaries as “building blocks” for ML solutions.
\n
Many of these packages are community developed, iterate with fast-paced development cycles, and required \"Subject Matter Expert\" (SME) knowledge to understand and use.
\n
Traditional approaches to software management for this requirement, often result in expensive, toil-filled processes, which act as a bottleneck on the delivery of value.
\n
\n
\n
Context:
\n
There are industry standard package repositories, typically aligned to programming language that serve the ML community for most requirements.
\n
\n
Approach:
\n
Safelist three industry standard ML package repositories, allowing self-serve from individual AML workspaces. Then, use an automated testing process during the deployment to scan the resulting solution containers. Failures would elegantly exit the deployment process and remove the container.
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Data scientists working within a specific AML workspace with network configuration applied, can self-serve ML packages on-demand from the whitelisted repositories. - An exception process is required for everything else, using the Private Storage pattern, seeded/maintained via a centralized function.
\n
AML delivers ML solutions as docker containers. As these solutions are developed, they are uploaded to the Azure Container Registry (ACR). Defender for Containers would be used to for the vulnerability scanning process.
\n
Solution deployment occurs via a CI/CD process. Defender for DevOps is used across the stack to provide security posture management and threat protection.
\n
Only if the solution container passes each of the security processes will it be deployed. Failure will result in the deployment elegantly exiting with error notifications, full audit trails and the solution container being discarded.
\n\n
\n
5.2. MVP Monitoring
\n
\n
The suggested MVP monitoring for this design is:
\n
\n
\n
5.2.1.1 - Model Performance – Data Drift
\n
\n
Description - Data drift tracks changes in the distribution of a model's input data by comparing it to the model's training data or recent past production data. Environment - Production. Implementation - AML – Model Monitoring. Notes - Data drift refactoring requires recent production datasets and outputs, to be available for comparison.
\n
\n
\n
5.2.1.2 - Model Performance – Usage
\n
\n
Description - Several model serving endpoint metrics to indicate quality and performance. Environment - All. Implementation - Azure Monitor AML metrics. Notes - This table has the supporting information to identify the AML workspace, deployment etc.
\n
\n
\n
5.2.1.3 - Model Performance – Prediction Drift
\n
\n
Description - Prediction drift tracks changes in the distribution of a model's prediction outputs by comparing it to validation or test labeled data or recent past production data. Environment - Production. Implementation - Azure Monitor AML metrics. Notes - Prediction drift refactoring requires recent production datasets and outputs, to be available for comparison.
\n
\n
\n
5.2.2.1 - Usage - Client Requests
\n
\n
Description - Count of the Client Requests to the model endpoint. Environment - Production. Implementation; - Machine Learning Services - OnlineEndpoints. - Count of RequestPerMintute. Notes - Acceptable thresholds could be aligned to t-shirt sizing’s or anomalies (acknowledging the need to establish a baseline). - When a model is no longer being used, it should be retired from production.
\n
\n
\n
5.2.2.2 - Usage - Throttling Delays
\n
\n
Description - Throttling Delays in request and response in data transfer. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Sum of RequestThrottlingDelayMs. - ResponseThrottlingDelayMs. Notes - Acceptable thresholds should be aligned service's \"Service Level Agreement\" (SLA) and the solution's non-functional requirements (NFRs).
\n
\n
\n
5.2.2.3 - Usage - Errors Generated
\n
\n
Description - Response Code - Errors generated. Environment - Production. Implementation; - [AMLOnlineEndpointTrafficLog](/azure/machine-learning/monitor-resource-reference?view=azureml-api-2#amlonlineendpointtrafficlog-table-preview). - Count of XRequestId by ModelStatusCode. - Count of XRequestId by ModelStatusCode & ModelStatusReason. Notes - All HTTP responses codes in the 400 & 500 range would be classified as an error.
\n
\n
\n
5.2.3 - Budget Boundaries
\n
\n
Description - When monthly Operating expenses (OPEX), based on usage or cost, reaches or exceeds a predefined amount. Environment - All. Implementation - Azure – Budget Alerts. Notes; - Budget thresholds should be set based upon the initial NFR’s and cost estimates. - Multiple threshold tiers should be used, ensuring stakeholders get appropriate warning before the budget is exceeded. - Consistent budget alerts could also be a trigger for refactoring to support greater demand.
\n
\n
\n
5.2.4 - Workspace – Staleness
\n
\n
Description - When an AML workspace no longer appears to have active use. Environment - Development. Implementation; - Azure Monitor AML metrics; - Machine Learning Services - Workspaces - count of Active Cores over a period. Notes; - Active Cores should equal zero with aggregation of count. - Date thresholds should be aligned to the project schedule.
\n
\n
\n
5.2.5 - Security Controls inc. RBAC
\n
\n
Description - Ensuring the appropriate security controls and baseline are implemented and not deviated from. Environment - All. Implementation; - Azure – Policies. - Including the “Audit usage of custom RBAC roles”. Notes;. - The full listing of available in-built policies is available for AML. - Other components/services used in this design should also have their specific in-built policies reviewed and implemented where appropriate.
\n
\n
\n
5.2.6 - Deployment – Standards/Governance
\n
\n
Description - Ensuring the appropriate standards and guardrails are adhered too. Environment - Azure & CI/CD. Implementation; - Azure – DevOps Pipelines. - PSRule for Azure. - Enterprise Policy As Code (EPAC) (azure.github.io). Notes; - PSRule provides a testing framework for Azure Infrastructure as Code (IaC). - EPAC can be used in CI/CD based system deploy Policies, Policy Sets, Assignments, Policy Exemptions and Role Assignments. - Microsoft guidance is available in the Azure guidance for AML regulatory compliance.
\n
\n
\n
5.2.7 - Deployment – Security Scanning
\n
\n
Description - Automated security scanning is executed as part of the automated integration and deployment processes. Environment - CI/CD. Implementation - Azure – Defender For DevOps. Notes - This processes can be extended with Azure marketplace for 3rd party security testing modules.
\n
\n
\n
5.2.8 - Model – Endpoint Security
\n
\n
Description - Targeted security monitoring of any AML endpoint. Environment - All. Implementation - Azure – Defender For APIs.
\n
\n
\n
5.2.9 - Development – Ongoing service
\n
\n
Description - A development model appearing provide a regular service that should be productionised. Environment - Development. Implementation; - Azure Monitor AML metrics. - AMLOnlineEndpointTrafficLog - count of XMSClientRequestId over a month. Notes - Date thresholds should be aligned to the project schedule.
\n
\n
\n
Important:
\n
Several of the implementations are in Preview (as at Mar ‘24), please refer to Preview Terms Of Use for greater detail.
\n
\n
6. Security
\n
\n
6.1. SDLC Access Patterns
\n
\n
The Access patterns required to support the full Software Development Lifecycle (SDLC) can be illustrated as:
System/compute access to components/services is based upon identity, with Managed identities being preferred due to the strong security posture.
\n
Individuals access to components/services and data are based upon their Microsoft Entra ID identity, and its Azure – RBAC group membership. - The design will use Azure defined RBAC roles over custom roles due to the reduced operating toil and risk of keeping custom roles up-to-date.
\n
Access patterns can be aligned to the SDLC phase; - Development - the access required to support the analysis, development, and initial testing of ML models. The access required by a new implementation is a subset of the access requirement for the iteration of an existing solution. - Testing - temporary access required to support the deployment and Quality Assurance (QA) model testing as a prerequisite to production release. - Production – the access required by a productionize ML model, released via an Azure AML endpoint to downstream consumers.
\n
Azure AI Services APIs are available to development processes as part of the enterprise shared service. Once the model is productionized, a workspace specific implementation of that API is used.
\n
Depending on the individual solution's non functional requirements (NFRs), serving a model via an AML endpoint may not be appropriate. Other services, such as App Service, Azure Kubernetes Service (AKS), etc., could be considerd. But these requirements are Out-of-scope for this PoV.
\n
\n
\n
6.2. Identity RBAC – Personas
\n
\n
This design considers the following Persona’s to inform the identity-based RBAC group design:
\n
\n
\n
R1 - Data Scientist/ML Engineer
\n
\n
Description - The people doing the various ML and data science activities across the SLDC lifecycle for a project. This role's responsibilies include break and fix activities for the ML models, packages, and data, which sit outside of platform support expertise. Type - Person. Project Specific - Yes. Notes - Involves data exploration and preprocessing to model training, evaluation, and deployment, to solve complex business problems and generate insight.
\n
\n
\n
R2 - Data Analyst
\n
\n
Description - The people doing the data analyst tasks required as an input to data science activities. Type - Person. Project Specific - Yes. Notes - This role involves working with data, performing analysis, and supporting model development and deployment activities.
\n
\n
\n
R3 - Model Tester
\n
\n
Description - The compute process used in Staging & QA testing. Type - Person. Project Specific - Yes. Notes - This role provides functional segregation from the CI/CD processes.
\n
\n
\n
R4 - Business Stakeholders
\n
\n
Description - Business stakeholders attached to the project. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace components in development.
\n
\n
\n
R5 - Project Lead (Data Science Lead)
\n
\n
Description - The Data Science lead in a project administration role for the AML workspace. Type - Person. Project Specific - Yes. Notes - This role would also have break/fix responsibility for the ML models and packages used.
\n
\n
\n
R6 - Project Owner (Bus Owner)
\n
\n
Description - The Business stakeholders responsible for the AML workspace based upon data ownership. Type - Person. Project Specific - Yes. Notes - This role is read-only for the AML workspace configuration and components in development. Production coverage will be provided by the data governance application.
\n
\n
\n
R7 - Platform Technical Support
\n
\n
Description - The Technical support staff responsible for break/fix activities across the platform. This role would cover infrastructure, service, etc. But not the ML models, packages or data. These elements remain under the Data Scientist/ML Engineer role's responsibility. Type - Person. Project Specific - No. Notes - While the role group is permanent, membership is only transient, based upon a Privileged Identity Management (PIM) process for time boxed, evaluated access.
\n
\n
\n
R8 - Model End User
\n
\n
Description - The End consumers of the ML Model. This role could be a downstream process or an individual. Type - Person and Process. Project Specific - Yes.
\n
\n
\n
R9 - CI/CD processes
\n
\n
Description - The compute processes that releases/rolls back change across the platform environments. Type - Process. Project Specific - No.
\n
\n
\n
R10 - AML Workspace
\n
\n
Description - The managed identities used by an AML workspace to interact with other parts of Azure. Type - Person. Project Specific - No. Notes - This persona represents the various services that make up an AML implementation, which interact with other parts of the platform, such as, the development workspace connecting with the development data store, etc.
\n
\n
\n
R11 - Monitoring Processes
\n
\n
Description - The compute processes which monitor & alert based upon platform activities. Type - Process. Project Specific - No.
\n
\n
\n
R12 - Data Governance Processes
\n
\n
Description - The compute process that scans the ML project and datastores for data governance. Type - Process. Project Specific - No.
\n
\n
6.3. Identity RBAC – Control Plane
\n
\n
The Control plane is used to manage the resource level objects with a subscription.
\n
\n
The Persona based identity RBAC design for the control plane for each environment can be described as;
\n
\n
\n
Production:
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Development:
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. LAR = Log Analytics Reader. LAC = Log Analytics Contributor. MR = Monitoring Reader. MC = Monitoring Contributor.
\n
\n
\n
\n
Important:
\n
Once a model has been productionized using one or more Azure AI Services API’s, service specific built-in roles should be implemented into that project.
\n
\n
6.4. Identity RBAC – Data/Model Plane
\n
\n
The Data plane is used to manage the capabilities exposed by a resource.
\n
\n
The Persona based identity RBAC design for the data plane for each environment can be described as;
\n
\n
Production:
\n
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Development:
\n
\n
\n
\n
Cell Colour = Access Period Granted. Green = Life of Project, Orange = Temporary, Just-in-time.
\n
\n
Key: Standard Roles R = Reader. C = Contributor. O = Owner. Component Specific Roles ADS = Azure Machine Learning Data Scientist. ACO = Azure Machine Learning Compute Operator. ARU = Azure Machine Learning Registry User. ACRPush = Azure Container Registry Push. DOPA = DevOps Project Administrators. DOPCA = DevOps Project Collection Administrators. KVA = Key Vault Administrator. KVA = Key Vault Administrator.
\n
\n
\n
Important:
\n
\n
Data plane controls are additive to the Control plane, i.e. they build on top of them.
\n
The Data plane controls vary depending on the specific AI Service selected, its recommended to take to most restrictive scope matched with the most appropriate built-in role available for the role/task requirements.
\n
\n
\n
7. SDLC Flow
\n
\n
This section describes the full Software Development Lifecycle (SDLC) for a departmental ML model.
\n
\n
A Departmental ML model development describes the most detailed work-through of the process. An Enterprise process is a simplified version of this process.
\n
\n
\n
7.1. Step 1 – Create Development
\n
\n
For a new development, the first step is to create the development environment with the various AML components required and develop the initial version of the ML model.
\n
\n
Prerequisites
\n
\n
Assess the in-scope data, validating the reuse of the Enterprise or an existing Department implementation.
\n
Confirm the Project Lead and Business owner roles, and validate understanding/acceptance of the Responsible, Accountable, Consulted, and Informed (RACI).
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Create the Department related development Entra ID groups as described on the identity RBAC section.
\n
From deployment templates, create the AML workspace and data storage components in the development environment, linking together with compute identities. - This deployment includes linking to the production instance of the enterprise shared Microsoft's AI service API’s suite. - Tagging of components/services is key to driving policies, monitoring, and cost attribution.
\n
From deployment templates, create the AML data store in the development environment. - This approach enables the workspace users to create, alter, or update data as required to support the development process.
\n
Enable the Workspace compute managed identities to access the data storage.
\n
Update the Monitoring and Alerting rules for a new department workspace in the development environment, as per the MVP Monitoringsection.
\n\n
From this baseline, the project team is able to start ML development activities.
\n
\n
Important:
\n
This worked example is for a new Dept setup, but the same process would apply for the initial Enterprise or individual project setups.
\n
\n
7.2. Step 2 – Push to testing
\n
\n
Once the model completes the initial testing phases, it should progress through Quality Assurance (QA) testing. If testing is failed, this process would exit with alerting back to the project. The new model elements would be removed, enabled access backed out, and process logs made available for trouble-shooting.
\n
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, the model, configuration and metadata are \"pulled\" into the deployment pipeline.
\n
Update the Monitoring and Alerting rules for a new model entering the testing phase, as per the MVP Monitoring section.
\n
Model data (if necessary) is populated into the production data to support the testing tasks.
\n
The Shared Staging workspace is updated for the new model deployment and components are stood-up to complete model/manifest deployment testing.
\n
Once staging has completed, the Shared QA workspace is updated for the new model deployment. QA Components are stood-up to complete integration, performance & volume, and security testing, etc. - This phase of testing will be extended over time as individual projects extend the QA testing harness.
\n
All audit & testing logs are made available back to the project team.
\n\n
\n
7.3. Step 3 – Release to Production
\n
\n
Once the model completes QA testing, it would be deployed into production. Process failure would trigger a support incident, in addition to the failure attributes as described for Step 2.
\n
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Create the Department related production Entra ID groups as described on the identity RBAC section.
\n
Removing the model and data components from the Staging and QA workspaces.
\n
From deployment templates, create the department specific data store in the production immutable data store, tagged appropriately.
\n
From deployment templates, create the department specific AML production workspace using its managed identities connect to the data store.
\n
From deployment templates, link to the department specific Azure AI Services (for the subset of required services) via the AML production workspace – managed identity.
\n
From deployment templates, create the department ML repository in production using its managed identity connect to the AML workspace and the data store.
\n
Deploy the production workspace endpoint, enabling downstream processes or individuals to access/interact with the model. - Depending upon the desired Service Level Agreement (SLA) or Non Functional Requirements (NFRs), other model serving methods maybe appropriate such as Web Apps, Azure Kubernetes Service (AKS) etc. These options aren’t covered in this PoV.
\n
Update the Monitoring and Alerting rules for a new model entering production, as per the MVP Monitoring section.
\n\n
\n
7.4. Step 4 – Iteration
\n
\n
A Productionized model requires iterative development to ensure it remains \"fit for purpose\", addressing either data or prediction drift. This iterative process is the next step in the model development lifecycle.
\n
\n
Prerequisites
\n
\n
Signals from the production model process demonstrating a degradation in performance, output, cost, etc.
\n
\n
\n
\n
\n
\n
Process Flow
\n\n
Depending on timing, the development workspace may have been removed from the environment. If so, a new development deployment would be required following the Step 1 process.
\n
From the Production ML repository, copy across the current version model, configuration, metadata, logs, etc. providing the baseline to work from and inform the iteration refactoring activities.
\n
From the Immutable production data store, copy across the existing model’s datasets and register them for use in the deployment workspace - Depending on the scope/context of the work, this connection maybe a one-off or periodically required to get the latest updates. - The replication of data enables developers and testers to create or update data as required, without impacting the \"golden record\". - Other non-ML datasets would be ingested at this stage, if needed.
\n\n
\n
From this baseline, the project team is able to start the refactoring activities.
\n
7.5. Step 5 – Iteration Testing
\n
\n
As before, once the model iteration completes initial testing, it should progress through quality assurance testing. This process follows the process from Step 2 with the addition of ML Repository component.
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, the model, configuration and metadata are \"pulled\" into the deployment pipeline.
\n
The Department ML Repository is populated for the iterative deployment.
\n
The Enterprise Staging workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
\n
Staging Components are stood-up to complete model/manifest deployment testing.
\n
The Enterprise QA workspace is updated for the iterative deployment, with the ML repository compute managed identity given the access required.
\n
QA Components are stood-up to complete integration, Performance & volume, and security testing.
\n\n
\n
Once completed, the iterative model would be versioned and then released to production, following the process from Step 3.
\n
\n
7.6. Step 6 – Retirement
\n
\n
When a model has been replaced, depreciated or no longer delivers business value, it should be removed from the environment. For completeness, the process of removing a department installation is described here. An individual Model retirement would be a subset of these steps.
\n
\n
\n
\n
Process Flow
\n\n
Using the CI/CD framework, shut down the model serving endpoint, taking the model effectivity offline. - This approach \"smoke tests\" the removal, uncovering any hidden dependant solutions or processes.
\n
Removing the Department/model specific monitoring and alerting rules, false positives aren’t raised during this process.
\n
Removing the Department development workspace and related identities.
\n
Removing the Department development data store and data.
\n
Upload copies of the model, configuration, and metadata, to an archive, if necessary.
\n
Removing the Department ML repository, production workspace components and related identities.
\n
Removing the Department production data store. Data could also be transitioned to a cooler service tier, if long term retention is a requirement.
\n
Removing the Department specific Entra ID groups and identities.
This article provides an opinionated design for an enterprise-level data science capability, implemented within an Azure data platform. The guidance provides a starting point for the design of an ML platform that fits your business requirements.
","introduction":"","coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""},"currentRevision":{"__ref":"Revision:revision:4111655_10"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":17765},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":"An Enterprise Design for Azure Machine Learning - An Architect's Viewpoint","seoDescription":"This article provides an opinionated design for an enterprise-level data science capability, implemented within an Azure data platform. The guidance provides a starting point for the design of an ML platform that fits your business requirements.","placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"blogMessagePolicies":{"__typename":"BlogMessagePolicies","canDoAuthoringActionsOnBlog":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","key":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDExOTIzMSw0MTE5MjMx","node":{"__ref":"BlogReplyMessage:message:4119231"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDExOTIzMSw0MTE0MDA5","node":{"__ref":"BlogReplyMessage:message:4114009"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":10}},"Conversation:conversation:4111655":{"__typename":"Conversation","id":"conversation:4111655","solved":false,"topic":{"__ref":"BlogTopicMessage:message:4111655"},"lastPostingActivityTime":"2024-04-20T04:45:51.590-07:00","lastPostTime":"2024-04-20T04:45:51.590-07:00","unreadReplyCount":2,"isSubscribed":false},"ModerationData:moderation_data:4111655":{"__typename":"ModerationData","id":"moderation_data:4111655","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0N2kyNTA5QTgxNDdENjkzOTIy?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0N2kyNTA5QTgxNDdENjkzOTIy?revision=10","title":"secureAML_NetworkOverview.png","associationType":"BODY","width":787,"height":462,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0OGk4OTA3RkYzMjBDRUU5QTZG?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0OGk4OTA3RkYzMjBDRUU5QTZG?revision=10","title":"secureAML_Network.png","associationType":"BODY","width":1466,"height":881,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0OWlGNjFEQTQzOUE2REYyODMz?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ0OWlGNjFEQTQzOUE2REYyODMz?revision=10","title":"secureAML_Package.png","associationType":"BODY","width":769,"height":409,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1MGlFMjI0QzdFNEEzOERBNzU2?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1MGlFMjI0QzdFNEEzOERBNzU2?revision=10","title":"secureAML_Access.png","associationType":"BODY","width":1069,"height":664,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1MmlBODBCREExNTIyM0VFQUNC?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1MmlBODBCREExNTIyM0VFQUNC?revision=10","title":"secureAML_ControlPrd.png","associationType":"BODY","width":1333,"height":604,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1M2lDMzVFNjdFQTcwQTg0NzU1?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1M2lDMzVFNjdFQTcwQTg0NzU1?revision=10","title":"secureAML_ControlPre.png","associationType":"BODY","width":1122,"height":607,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1NGlGNENFMEY1NzI5MTg1MTk3?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1NGlGNENFMEY1NzI5MTg1MTk3?revision=10","title":"secureAML_DataPrd.png","associationType":"BODY","width":1432,"height":679,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1NWk2OTE2MDE3Mzc1ODg4RDY3?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1NWk2OTE2MDE3Mzc1ODg4RDY3?revision=10","title":"secureAML_DataPre.png","associationType":"BODY","width":1234,"height":607,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1N2lDRENEREI2QUE4NUQ5NEZF?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1N2lDRENEREI2QUE4NUQ5NEZF?revision=10","title":"secureAML_flowS1.png","associationType":"BODY","width":664,"height":741,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1OWk0QTQ2RUIzMzYxNzg1QzhG?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ1OWk0QTQ2RUIzMzYxNzg1QzhG?revision=10","title":"secureAML_flowS2.png","associationType":"BODY","width":979,"height":709,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2MGlENTVENEQzMzFFQTlBQkIw?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2MGlENTVENEQzMzFFQTlBQkIw?revision=10","title":"secureAML_flowS3.png","associationType":"BODY","width":924,"height":685,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2Mmk1NEQxNERCNTg4MkNDMDQw?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2Mmk1NEQxNERCNTg4MkNDMDQw?revision=10","title":"secureAML_flowS4.png","associationType":"BODY","width":903,"height":786,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2NGkzRDFCM0NGN0YxNkQ3NUQz?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2NGkzRDFCM0NGN0YxNkQ3NUQz?revision=10","title":"secureAML_flowS5.png","associationType":"BODY","width":1081,"height":693,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2NWlCM0U5NTFERDYwRUI4MTE4?revision=10\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MTExNjU1LTU3MDQ2NWlCM0U5NTFERDYwRUI4MTE4?revision=10","title":"secureAML_flowS6.png","associationType":"BODY","width":1168,"height":658,"altText":null},"Revision:revision:4111655_10":{"__typename":"Revision","id":"revision:4111655_10","lastEditTime":"2024-04-11T18:01:12.147-07:00"},"CachedAsset:theme:customTheme1-1743057496629":{"__typename":"CachedAsset","id":"theme:customTheme1-1743057496629","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#333333","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1737571274000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1737571274000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/blogs/BlogMessagePage:board:MachineLearningBlog-1743057494899":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/blogs/BlogMessagePage:board:MachineLearningBlog-1743057494899","value":{"id":"BlogMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"blog-article","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":"LOCKED","bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[{"id":"blogs.widget.blogArticleWidget","className":"lia-blog-container","props":null,"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"}},{"id":"section-1729184836777","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":false,"showDescription":false,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[],"side":[{"id":"custom.widget.Social_Sharing","className":null,"props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":true,"title":"Share","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/blogs/BlogMessagePage-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-pages/blogs/BlogMessagePage-1737571274000","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This blog post cannot be found","name":"Blog Message Page","section.blog-article.title":"Blog Post","archivedMessageTitle":"This Content Has Been Archived","section.section-1729184836777.title":"","section.section-1729184836777.description":"","section.CncIde.title":"Blog Post","section.tifEmD.description":"","section.tifEmD.title":""},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1743057323647":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1743057323647","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"planner","params":{"categoryId":"Planner"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoft-endpoint-manager"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-q-l-server","params":{"categoryId":"SQL-Server"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"SMB"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1737571274000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1743057526532":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1743057526532","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display:block;\n box-shadow:none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size:14px;\n }\n}","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1a5zb_1 {\n a.custom_widget_community_banner_top-bar_1a5zb_2.custom_widget_community_banner_btn_1a5zb_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display:block;\n box-shadow:none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size:0.875rem;\n }\n}","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1a5zb_1","top-bar":"custom_widget_community_banner_top-bar_1a5zb_2","btn":"custom_widget_community_banner_btn_1a5zb_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1743057526532":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1743057526532","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search."},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.Social_Sharing-en-1743057526532":{"__typename":"CachedAsset","id":"component:custom.widget.Social_Sharing-en-1743057526532","value":{"component":{"id":"custom.widget.Social_Sharing","template":{"id":"Social_Sharing","markupLanguage":"HANDLEBARS","style":".social-share {\n .sharing-options {\n position: relative;\n margin: 0;\n padding: 0;\n line-height: 10px;\n display: flex;\n justify-content: left;\n gap: 5px;\n list-style-type: none;\n li {\n text-align: left;\n a {\n min-width: 30px;\n min-height: 30px;\n display: block;\n padding: 1px;\n .social-share-linkedin {\n img {\n background-color: rgb(0, 119, 181);\n }\n }\n .social-share-facebook {\n img {\n background-color: rgb(59, 89, 152);\n }\n }\n .social-share-x {\n img {\n background-color: rgb(0, 0, 0);\n }\n }\n .social-share-rss {\n img {\n background-color: rgb(0, 0, 0);\n }\n }\n .social-share-reddit {\n img {\n background-color: rgb(255, 69, 0);\n }\n }\n .social-share-email {\n img {\n background-color: rgb(132, 132, 132);\n }\n }\n }\n a {\n img {\n height: 2rem;\n }\n }\n }\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"Adds buttons to share to various social media websites","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Social_Sharing","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Adds buttons to share to various social media websites","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_Social_Sharing_social-share_c7xxz_1 {\n .custom_widget_Social_Sharing_sharing-options_c7xxz_2 {\n position: relative;\n margin: 0;\n padding: 0;\n line-height: 0.625rem;\n display: flex;\n justify-content: left;\n gap: 0.3125rem;\n list-style-type: none;\n li {\n text-align: left;\n a {\n min-width: 1.875rem;\n min-height: 1.875rem;\n display: block;\n padding: 0.0625rem;\n .custom_widget_Social_Sharing_social-share-linkedin_c7xxz_18 {\n img {\n background-color: rgb(0, 119, 181);\n }\n }\n .custom_widget_Social_Sharing_social-share-facebook_c7xxz_23 {\n img {\n background-color: rgb(59, 89, 152);\n }\n }\n .custom_widget_Social_Sharing_social-share-x_c7xxz_28 {\n img {\n background-color: rgb(0, 0, 0);\n }\n }\n .custom_widget_Social_Sharing_social-share-rss_c7xxz_33 {\n img {\n background-color: rgb(0, 0, 0);\n }\n }\n .custom_widget_Social_Sharing_social-share-reddit_c7xxz_38 {\n img {\n background-color: rgb(255, 69, 0);\n }\n }\n .custom_widget_Social_Sharing_social-share-email_c7xxz_43 {\n img {\n background-color: rgb(132, 132, 132);\n }\n }\n }\n a {\n img {\n height: 2rem;\n }\n }\n }\n }\n}\n","tokens":{"social-share":"custom_widget_Social_Sharing_social-share_c7xxz_1","sharing-options":"custom_widget_Social_Sharing_sharing-options_c7xxz_2","social-share-linkedin":"custom_widget_Social_Sharing_social-share-linkedin_c7xxz_18","social-share-facebook":"custom_widget_Social_Sharing_social-share-facebook_c7xxz_23","social-share-x":"custom_widget_Social_Sharing_social-share-x_c7xxz_28","social-share-rss":"custom_widget_Social_Sharing_social-share-rss_c7xxz_33","social-share-reddit":"custom_widget_Social_Sharing_social-share-reddit_c7xxz_38","social-share-email":"custom_widget_Social_Sharing_social-share-email_c7xxz_43"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1743057526532":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1743057526532","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_f95yq_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_f95yq_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_f95yq_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_f95yq_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_f95yq_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_f95yq_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_f95yq_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_f95yq_78.custom_widget_MicrosoftFooter_f-bare_f95yq_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_f95yq_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_f95yq_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_f95yq_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_f95yq_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_f95yq_78.custom_widget_MicrosoftFooter_f-bare_f95yq_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_f95yq_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_f95yq_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_f95yq_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_f95yq_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_f95yq_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_f95yq_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_f95yq_58","c-list":"custom_widget_MicrosoftFooter_c-list_f95yq_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_f95yq_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_f95yq_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_f95yq_107"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1737571274000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1737571274000","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Planner":{"__typename":"Category","id":"category:Planner","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:SQL-Server":{"__typename":"Category","id":"category:SQL-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:SMB":{"__typename":"Category","id":"category:SMB","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-endpoint-manager":{"__typename":"Category","id":"category:microsoft-endpoint-manager","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:4111655:10":{"__typename":"QueryVariables","id":"TopicReplyList:message:4111655:10","value":{"id":"message:4111655","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1737571274000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Small and Medium Businesses","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","microsoft-learn":"Microsoft Learn","s-q-l-server":"SQL Server","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Planner","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune and Configuration Manager","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","outlook":"Outlook","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1737571274000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1737571274000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1737571274000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1737571274000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1737571274000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1737571274000","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1737571274000","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1737571274000","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"Rank:rank:35":{"__typename":"Rank","id":"rank:35","position":16,"name":"Iron Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:1787":{"__typename":"User","id":"user:1787","uid":1787,"login":"mco365","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2016-07-16T09:07:13.115-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNzg3LTEyNDk5aThBNkU4OTQ4QzVDNDg3MEQ"},"rank":{"__ref":"Rank:rank:35"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1787"},"ModerationData:moderation_data:4119231":{"__typename":"ModerationData","id":"moderation_data:4119231","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4119231":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:1787"},"id":"message:4119231","revisionNum":1,"uid":4119231,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:MachineLearningBlog"},"parent":{"__ref":"BlogTopicMessage:message:4111655"},"conversation":{"__ref":"Conversation:conversation:4111655"},"subject":"Re: An Enterprise Design for Azure Machine Learning - An Architect's Viewpoint","moderationData":{"__ref":"ModerationData:moderation_data:4119231"},"body":"
Thank you for the comprehensive analysis and relevant design, very well done!
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"79","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-04-20T04:45:51.590-07:00","lastPublishTime":"2024-04-20T04:45:51.590-07:00","metrics":{"__typename":"MessageMetrics","views":4037},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:AI/category:solutions/category:communities/community:gxcuf89792board:MachineLearningBlog/message:4111655/message:4119231","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Rank:rank:37":{"__typename":"Rank","id":"rank:37","position":18,"name":"Copper Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:363354":{"__typename":"User","id":"user:363354","uid":363354,"login":"kparmar","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-06-19T16:05:08.668-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-7.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:363354"},"ModerationData:moderation_data:4114009":{"__typename":"ModerationData","id":"moderation_data:4114009","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4114009":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:363354"},"id":"message:4114009","revisionNum":1,"uid":4114009,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:MachineLearningBlog"},"parent":{"__ref":"BlogTopicMessage:message:4111655"},"conversation":{"__ref":"Conversation:conversation:4111655"},"subject":"Re: An Enterprise Design for Azure Machine Learning - An Architect's Viewpoint","moderationData":{"__ref":"ModerationData:moderation_data:4114009"},"body":"
Excellent Article
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"19","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-04-14T16:39:58.329-07:00","lastPublishTime":"2024-04-14T16:39:58.329-07:00","metrics":{"__typename":"MessageMetrics","views":4526},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:AI/category:solutions/category:communities/community:gxcuf89792board:MachineLearningBlog/message:4111655/message:4114009","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1737571274000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1737571274000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCoverImage-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCoverImage-1737571274000","value":{"coverImageTitle":"Cover Image"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeTitle-1737571274000","value":{"nodeTitle":"{nodeTitle, select, community {Community} other {{nodeTitle}}} "},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTimeToRead-1737571274000","value":{"minReadText":"{min} MIN READ"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1737571274000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1737571274000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1737571274000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1737571274000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1737571274000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1737571274000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1737571274000","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1737571274000","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1737571274000","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1737571274000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1737571274000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1737571274000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeAvatar-1737571274000","value":{"altTitle":"Node avatar for {nodeTitle}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeDescription-1737571274000","value":{"description":"{description}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1737571274000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1737571274000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1737571274000","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false}}}},"page":"/blogs/BlogMessagePage/BlogMessagePage","query":{"boardId":"machinelearningblog","messageSubject":"an-enterprise-design-for-azure-machine-learning---an-architects-viewpoint","messageId":"4111655"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/blogs/BlogArticleWidget/BlogArticleWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=BlogMessagePage&entity.id=board%3Amachinelearningblog&entity.id=message%3A4111655","strategy":"afterInteractive"}]}