From f46eacbdeaab6f9292220eeb27f45c208a40c1f4 Mon Sep 17 00:00:00 2001 From: a-frankl Date: Wed, 30 Oct 2024 10:35:36 +0000 Subject: [PATCH 1/5] punctuation --- doc/overview/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/overview/introduction.rst b/doc/overview/introduction.rst index e5d6ee1dd..6af4d2137 100644 --- a/doc/overview/introduction.rst +++ b/doc/overview/introduction.rst @@ -3,7 +3,7 @@ Introduction to TRAC ==================== TRAC is a new type of analytics solution designed to work with cloud and big data technologies -to solve the challenge of managing complex and highly governed models across their lifecycle +to solve the challenge of managing complex and highly governed models across their lifecycle, for multiple personas. .. image:: ../_images/overview_personas.png From 76602e07a0cf155bb054c2cbc4c5e4c7aa4ae997 Mon Sep 17 00:00:00 2001 From: a-frankl Date: Tue, 5 Nov 2024 19:28:17 +0000 Subject: [PATCH 2/5] punctuation --- doc/_images/icon_audit.png | Bin 0 -> 12799 bytes doc/_images/icon_corrupt.png | Bin 0 -> 13663 bytes doc/_images/icon_data.png | Bin 0 -> 12762 bytes doc/_images/icon_flow.png | Bin 0 -> 9292 bytes doc/_images/icon_job.png | Bin 0 -> 11673 bytes doc/_images/icon_model.png | Bin 0 -> 9474 bytes doc/_images/icon_persist.png | Bin 0 -> 16314 bytes doc/_images/icon_repeat.png | Bin 0 -> 17992 bytes doc/_images/icon_self_doc.png | Bin 0 -> 14480 bytes doc/_images/icon_sufficient.png | Bin 0 -> 15254 bytes doc/conf.py | 2 +- doc/index.rst | 29 +-- doc/overview/index.rst | 1 - doc/overview/introduction.rst | 364 ++++++++++++++++++++------------ doc/overview/key_concepts.rst | 188 +++++++++++++++++ doc/unused/tags.rst | 191 +++++++++++++++++ 16 files changed, 626 insertions(+), 149 deletions(-) create mode 100644 doc/_images/icon_audit.png create mode 100644 doc/_images/icon_corrupt.png create mode 100644 doc/_images/icon_data.png create mode 100644 doc/_images/icon_flow.png create mode 100644 doc/_images/icon_job.png create mode 100644 doc/_images/icon_model.png create mode 100644 doc/_images/icon_persist.png create mode 100644 doc/_images/icon_repeat.png create mode 100644 doc/_images/icon_self_doc.png create mode 100644 doc/_images/icon_sufficient.png create mode 100644 doc/overview/key_concepts.rst create mode 100644 doc/unused/tags.rst diff --git a/doc/_images/icon_audit.png b/doc/_images/icon_audit.png new file mode 100644 index 0000000000000000000000000000000000000000..5c290014d685b5a52fed96bbecc927dc9c81d46f GIT binary patch literal 12799 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 V;?ngh@W&buHD#?kIkz7M{4cx2gg5{I literal 0 HcmV?d00001 diff --git a/doc/_images/icon_flow.png b/doc/_images/icon_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..8739bf7b671e6aa47a0a12602aae4bdfd1c68f59 GIT binary patch literal 9292 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 A_5c6? literal 0 HcmV?d00001 diff --git a/doc/_images/icon_job.png b/doc/_images/icon_job.png new file mode 100644 index 0000000000000000000000000000000000000000..2163b9c5729eb041a033760a8d4857f42e80beef GIT binary patch literal 11673 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 cH>SdEi1dToF^Uhsn+a literal 0 HcmV?d00001 diff --git a/doc/_images/icon_model.png b/doc/_images/icon_model.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9b85a1ad7e9aa08d18204300a18ccf6b1868b3 GIT binary patch literal 9474 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 literal 0 HcmV?d00001 diff --git a/doc/_images/icon_self_doc.png b/doc/_images/icon_self_doc.png new file mode 100644 index 0000000000000000000000000000000000000000..11f111227280b1bf73f266567c8e41115e0ff881 GIT binary patch literal 14480 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 literal 0 HcmV?d00001 diff --git a/doc/_images/icon_sufficient.png b/doc/_images/icon_sufficient.png new file mode 100644 index 0000000000000000000000000000000000000000..3750ba3a0e6a8565d9e3bb9e97216207f27ff253 GIT binary patch literal 15254 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 in association with the `finos Foundation `_ +under the `Apache Software License version 2.0 `_. + +This documentation site focuses on how to deploy the TRAC D.A.P. services and build both models and +applications which leverage those services. Commercially supported deployments of TRAC are separately available from `finTRAC Limited `_. - You can see the current development status and roadmap for the platform on the + +.. note:: + You can see the current development status of TRAC D.A.P. and a roadmap for the platform on the `roadmap page `_. If you have particular questions or issues, please raise a ticket on our `issue tracker `_. @@ -26,7 +29,7 @@ TRAC Data & Analytics Platform **Learn about TRAC** ^^^^^^^^^^^^^^^^^^^^ - Learn about the TRAC platform, starting with the metadata model. + Learn about the TRAC, the metadata model, virtual deployment framework and the TRAC Guarantee. +++ .. button-ref:: overview/introduction @@ -42,7 +45,7 @@ TRAC Data & Analytics Platform **Build and run models** ^^^^^^^^^^^^^^^^^^^^^^^^ - Use the TRAC runtime APIs to build portable, self-documenting models. + Use the TRAC runtime APIs to build portable, self-describing models. +++ .. button-ref:: modelling/index @@ -74,10 +77,10 @@ TRAC Data & Analytics Platform :class-footer: sd-border-0 - **Deploy and manage the platform** + **Deploy and manage TRAC D.A.P.** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Everything to do with deployment, configuration and technology integration, + Explore deployment, configuration and integration, for dev-ops engineers and systems administrators. +++ diff --git a/doc/overview/index.rst b/doc/overview/index.rst index 90c4055fb..92788aa3e 100644 --- a/doc/overview/index.rst +++ b/doc/overview/index.rst @@ -6,4 +6,3 @@ Platform Overview .. toctree:: ./introduction - ./metadata_model diff --git a/doc/overview/introduction.rst b/doc/overview/introduction.rst index 6af4d2137..e9c094605 100644 --- a/doc/overview/introduction.rst +++ b/doc/overview/introduction.rst @@ -1,155 +1,251 @@ +Introduction +==================== + +TRAC is a universal model orchestration solution that combines your existing data and compute infrastructure, +model development environments and the repository of versioned code, to create a single ecosystem in +which to build and deploy models, orchestrate complex workflows and run analytics. + +The platform is built around three key principles, selected to break the trade-off that has traditionally +been required, between flexible (but uncontrolled) analytics solutions and highly controlled (but +inflexible) production platforms. + +.. list-table:: + :widths: 30 40 200 + + * - |icon-sufficient| + - **SUFFICIENT** + - The same infrastructure, tools and business assets support both production and experimental model runs, and post-run analytics. TRAC therefore supports all possible uses of a model and no other deployment environments are required. + + * - |icon-corrupt| + - **INCORRUPTIBLE** + - The platform's design makes it impossible to accidentally damage or destroy deployed data, models or flows. Model developers and users can therefore self-serve with confidence, free from the constraints of traditional change control processes. + + * - |icon-self-doc| + - **SELF-DOCUMENTING** + - TRAC automatically generates governance-ready documentation with no manual input required, eliminating the need to manually compile paper evidence for model deployment oversight, data lineage reporting and internal audit. -Introduction to TRAC +Because TRAC is sufficient, incorruptible and self-documenting you get the best of both worlds. Maximal +control and transparency plus analytical flexibility, in a single solution. + +.. |icon-sufficient| image:: /_images/icon_sufficient.png + :width: 85px + :height: 85px + +.. |icon-corrupt| image:: /_images/icon_corrupt.png + :width: 85px + :height: 85px + +.. |icon-self-doc| image:: /_images/icon_self_doc.png + :width: 85px + :height: 85px + + + + +TRAC Metadata Model ==================== -TRAC is a new type of analytics solution designed to work with cloud and big data technologies -to solve the challenge of managing complex and highly governed models across their lifecycle, -for multiple personas. +Structural Model +~~~~~~ -.. image:: ../_images/overview_personas.png - :align: center +TRAC is built around a structural metadata model which catalogues, describes and controls almost everything that happens on the platform. The model consists of two layers. -.. grid:: 1 2 2 2 - :gutter: 3 +.. list-table:: + :widths: 25 200 - .. grid-item-card:: - :class-header: sd-bg-light sd-pt-0 sd-pb-1 - :class-body: sd-py-0 - :shadow: md + * - **OBJECTS** + - Objects are the model’s structural elements. Data, models and jobs are all described by metadata objects. Each type of object has a metadata structure that is + defined as part of the TRAC API. - **What is TRAC?** - ^^^^^^^^^^^^^^^^^ + * - **TAGS** + - Tags are used to index, describe and control objects, they are made up of key-value attributes. + Some attributes are controlled by the platform, others can be set by client applications or + edited by users. - * A model management and orchestration solution which is; - * Built around a structural meta-data model - * Designed to manage complex, critical, highly governed models - * Open source and free of any licence costs - * Compatible with all major cloud providers and Hadoop +Primary Object Types +~~~~~~~~ +All model orchestration and analytics use cases can be understood in reference to four primary object types. They are not the +the only types of object on TRAC but they are the most common and important. - .. grid-item-card:: - :class-header: sd-bg-light sd-pt-0 sd-pb-1 - :class-body: sd-py-0 - :shadow: md +.. list-table:: + :widths: 25 25 65 100 + :header-rows: 1 + + * - OBJECT + - TYPE + - EXTERNAL REFERENCE + - OBJECT COMPONENTS + * - |icon-data| + - **DATA** + - Collections of documents and records which have been imported into a TRAC-controlled Data Store + - A structural representation of the data schema plus information about its physical storage + * - |icon-model| + - **MODEL** + - Discrete units of code stored in a repository, which are exposed to TRAC via the model import process + - A structural representation of the model schema plus reference to immutable model code or a binary package (e.g. in Git or Nexus) + * - |icon-flow| + - **FLOW** + - NA - flows exists only as TRAC metadata objects + - A calculation graph where inputs, outputs and models are the nodes and edges represent data flow + * - |icon-job| + - **JOB** + - A process or calculation orchestrated by TRAC which may use one or more external system or resource. There are five job types; ImportModel, ImportData, RunModel, RunFlow and ExportData + - The detail varies by job type but it will map the job reference to the objects used as inputs and those generated as outputs. For a RunFlow job this includes the flow plus models, data and parameters used as inputs and the datasets the job generated. + + + +.. |icon-data| image:: /_images/icon_data.png + :width: 85px + :height: 85px + +.. |icon-model| image:: /_images/icon_model.png + :width: 85px + :height: 85px + +.. |icon-flow| image:: /_images/icon_flow.png + :width: 85px + :height: 85px + +.. |icon-job| image:: /_images/icon_job.png + :width: 85px + :height: 85px + + +Versioning +~~~~~~~~ + +Metadata records are maintained using an immutable, time-indexed version history, with "updates" being +performed by creating a new version of the object or tag. TRAC metadata therefore provides a fully +consistent historical view of the platform and a complete audit history that is both machine and human +readable. + +Where metadata objects refer to external resources such as models and data, those resources are +also immutable. This is achieved using e.g. GitHub tags or Nexus binary versions for models, and data +areas owned by TRAC with controlled write access for primary data. + + +Virtual Deployment Framework +==================== + +Self-describing Models +~~~~~~~~ +Models can be imported and used with zero code modifications or platform-level interventions, so long as +the model code contains a custom function which declares the model's schema to the platform. A model schema +consists of: + +* The schema of any data inputs the model needs to run - **What is different about TRAC?** - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* The schema of any optional or required parameters which affect how the model runs - * Integrates the model inventory, code repository and model execution - * Systemizes the model execution process, including overlays and sign-off - * Comprehensive version history and audit trail (BCBS239, SoX) - * Perfect roll-back and repeatability of any historical calculation - * Easy to configure what-if and champion-challenger analysis - * Flexible system for policy controls and model risk reporting +* The schema of the output data which the model produces when it runs -Structured meta-data model --------------------------- +Model Deployment Process +~~~~~~~~ + +TRAC uses a 'virtual' model deployment framework, in which model code remains in an external repository +and is accessed at runtime. There are three main processes involved in this framework and TRAC performs +validations at each of the steps. These validations replace the traditional route-to-live process and +allow models to be deployed and used without platform-level interventions or code changes. + +.. list-table:: + :widths: 35 40 140 70 + :header-rows: 1 + + * - OBJECT + - PROCESS + - SUMMARY + - RTL VALIDATION -TRAC is built around a structural metadata model which, combined with the immutability of -the underlying objects, gives users a full version history, lineage, roll-back and repeatability. + * - |icon-model| + - **IMPORT MODELS** + - Importing a model creates an object in the TRAC metadata store which refers to and describes the model. This record includes the model schema. The model is not deployed (in the traditional, physical sense) because the code remains in the repository. + - Does the model code contain a properly constructed function declaring its schema? -.. image:: ../_images/overview_metadata.png - :align: center + * - |icon-flow| + - **BUILD FLOW** + - Flows can be built and validated on the platform using only the schema representations of the models. Flows exist only as metadata objects, so a flow is like a ‘virtual’ deployment of some models into an execution process. + - Is the model schema compatible with it's proposed placing in the calculation graph? + * - |icon-job| + - **RUN JOBS** + - For a RunFlow job you first pick a flow and the. select the data and model objects to use for each node, plus any required parameters. TRAC then fetches the model code and the data records from storage and orchestrates the calculations as a single job. + - Does the model code generate outputs which are consistent with the declared schema? -The 'No-IT' operating model ---------------------------- -TRAC empowers model developers and model users to self-serve within a controlled environment, -eliminating the need for a platform support team to manage configuration and deployments at -the application level. +In addition to these steps, the TRAC Runtime can be deployed to your IDE of choice, +giving you all the type safety of production and ensuring that models translate to production without +modification. Any model which executes via the TRAC Runtime service in the IDE with local data inputs +will run on the platform. + + +TRAC Guarantee +==================== + +TRAC offers a unique control environment which is characterised by three guarantees. + +.. list-table:: + :widths: 30 30 200 + + * - |icon-audit| + - **AUDITABLE ACTIONS** + - Any action that changes a tag or creates an object is recorded in a time-consistent fashion in the + metadata model. The metadata is designed to be easily understood by humans and machines and + standard report formats can be used to create governance-ready documentation with no manual input + required. + + * - |icon-repeat| + - **REPEATABLE JOBS** + - Any RunModel or RunFlow job can be re-resubmitted and because the inputs are immutable you will + get the same result, guaranteed. We account for multiple factors that cause non-deterministic + model output: threading (don't use it!), random number generation, time, external calls and + dynamic execution (these are disabled), language and library versions (these are recorded + with the metadata). + + * - |icon-persist| + - **RISK FREE PLATFORM** + - Every version of every object (model, data, flow) remains permanently available to use and there is + no possibility of accidental loss or damage to deployed assets. Therefore, there is no change risk + (as traditionally defined) on TRAC. + +.. |icon-audit| image:: /_images/icon_audit.png + :width: 85px + :height: 85px + +.. |icon-repeat| image:: /_images/icon_repeat.png + :width: 85px + :height: 85px + +.. |icon-persist| image:: /_images/icon_persist.png + :width: 85px + :height: 85px + +.. note:: + The repeatability guarantee applies to RunModel, RunFlow and ExportData jobs. A model cannot be + imported twice so an ImportModel job cannot be repeated. An ImportData job can be repeated but + due to the dependence on an external source, TRAC cannot guarantee that the same outputs will be produced. + + +Experimentation & Analytics +==================== +In addition to supporting highly-controlled (or 'production') model execution processes, TRAC also provide two main ways to +construct 'experimental' model runs. .. list-table:: - :widths: 30 70 200 - - * - |icon-zero-risk| - - **Zero-risk deployment** - - TRAC's built-in repeatability guarantee allows new models, data and overlays to - be loaded and executed against production data at any time, with zero change risk, - so the traditional separation between user and platform team is redundant. - - * - |icon-self-gen-ui| - - **Self-generating UI** - - Models and data loaded onto the platform are immediately available to configure and - run in the user interface. The meta-data associated with model objects describes their - parameters and inputs, so the UI can be generated dynamically. - - * - |icon-auto-doc| - - **Automated documentation** - - Model implementation, data lineage and audit documentation is automated from the TRAC - meta-data, eliminating the need for labour-intensive paper production exercises by a - platform support team. - - * - |icon-ctrl| - - **User-defined controls** - - A configurable policy service enforces tagging of production (i.e. signed-off) assets, - preventing confusion with ad-hoc, experimental or challenger runs. This governs user - permissions and the allocation of platform resources. - - * - |icon-rtl| - - **Seamless route to live** - - In TRAC, everything is always live. The production model is controlled by sign-off policies, - to enforce constrains and record evidence before applying the “production” tag. The sign-off - process has full point-in-time history and every version remains available for rollback. - -.. |icon-zero-risk| image:: ../_images/icon-zero-risk.png - :width: 66px - :height: 66px - -.. |icon-self-gen-ui| image:: ../_images/icon-self-gen-ui.png - :width: 66px - :height: 66px - -.. |icon-auto-doc| image:: ../_images/icon-auto-doc.png - :width: 66px - :height: 66px - -.. |icon-ctrl| image:: ../_images/icon-ctrl.png - :width: 66px - :height: 66px - -.. |icon-rtl| image:: ../_images/icon-rtl.png - :width: 66px - :height: 66px - - -Compatibility and deployment ----------------------------- - -TRAC uses open standards to provide a familiar developer experience and several easy options for integration. - -.. image:: ../_images/overview_compatibility.png - :align: center - -.. grid:: 1 2 2 2 - :gutter: 3 - :class-container: sd-pt-2 - - .. grid-item-card:: - :class-header: sd-bg-light sd-pt-0 sd-pb-1 - :class-body: sd-py-0 - :shadow: md - - **Open standards** - ^^^^^^^^^^^^^^^^^^ - - * **Built on open standards** for maximum compatibility and minimum lock-in - * **Focus on developer experience** with a “batteries included” philosophy, - so developers can get going right away - * **Designed for integration** with complex data landscapes; open standards are best, - integration with bespoke components is also possible - - .. grid-item-card:: - :class-header: sd-bg-light sd-pt-0 sd-pb-1 - :class-body: sd-py-0 - :shadow: md - - **Deployment options** - ^^^^^^^^^^^^^^^^^^^^^^ - - * **Using established patterns** that your organization already has in place will simplify - deployment and maintenance - * **Cloud and tooling vendors** are willing to produce deployment templates for TRAC on their - platforms (some already have)! - * **Common tools** such as Terraform or Ansible can be set up quickly if there is nothing else in place + :widths: 40 200 + + * - **EXPERIMENTAL FLOWS** + - Separate flows can be created for any standardised analytic process, from sensitivity analysis + to periodic model monitoring. Under the virtual deployment framework, Jobs which use + these experimental flows are safely executed on production data and infrastructure. + + * - **EXPERIMENTAL INPUTS** + - Using a 'production' flow, alternate model versions, data inputs + or parameter values can be selected. For quick and simple what-if analysis, old + jobs can be loaded, edited and resubmitted, for example to run last year's models with + this year's data, or vice versa + +TRAC can execute as many parallel jobs as the underlying compute infrastructure will allow and because they +are isolated and stateless, multiple runs can use different versions of the same model or dataset +concurrently. This greatly reduces the time required to complete more complex comparative analytics. \ No newline at end of file diff --git a/doc/overview/key_concepts.rst b/doc/overview/key_concepts.rst new file mode 100644 index 000000000..314f5b37a --- /dev/null +++ b/doc/overview/key_concepts.rst @@ -0,0 +1,188 @@ +Key concepts + + +Metadata Model +==================== + +TRAC is built around a structural metadata model which catalogues and describes everything on the platform. The model consists of three layers: + +.. list-table:: + :widths: 40 200 + + * - **OBJECTS** + - Objects are the model’s structural elements and each object type has its own metadata structure. The most + + * - **TAGS** + - Tags are used to index, describe and control objects. Some tags are controlled by the platform, some you can set yourself. + + * - **TRACEABLE ACTIONS** + - Traceable actions are actions that create objects, such as running jobs or data imports. Read-only + actions such as querying data or metadata searches are not recorded in the metadata model. + + +Metadata records are maintained using an immutable, time-indexed version history, with "updates" being performed +by creating a new version of the object or tag with the required changes. Because of this, the TRAC metadata +provides a fully consistent historical view of the platform for any previous point in time. It also provides +a complete audit history that is both machine and human readable, with no manual effort. + +Where objects refer to external resources such as models and data, those resources are also immutable. +This is achieved using e.g. GitHub tags or Nexus binary versions for models, and data areas owned by TRAC with +controlled write access for primary data. The combination of immutable metadata and immutable resources allows +TRAC to recreate any previous calculation that has run on the platform. + + +Objects +_______ + +All model orchestration use-cases involve four primary object types. The TRAC metadata model includes other object types, but these are the most common. + +.. list-table:: + :widths: 40 40 100 100 + + * - |icon-data| + - **DATA** + - Collections of documents and records which have been imported into a TRAC-controlled Data Store + - Structural representation of the data schema, plus its physical storage location + + * - |icon-model| + - **MODEL** + - Discrete units of code stored in a repository and exposed to TRAC via the model upload process + - The model schema (inputs, outputs and parameters) plus reference to immutable model code or a binary package (e.g. in Git or Nexus) + + * - |icon-flow| + - **FLOW** + - None, the flow is abstract and does not refer to specific data or models + - A calculation involving multiple models represented as a graph where inputs, outputs and models are nodes and edges represent data flow + + * - |icon-job| + - **JOB** + - A process TRAC orchestrates. The five job types are; ImportModel, ImportData, RunModel, RunFlow and ExportData + - The metadata record varies by job type but will record objects which were uses in the process. + + +.. |icon-data| image:: ../../_images/icons/icon_data.png + :width: 66px + :height: 66px + +.. |icon-model| image:: ../../_images/icons/icon_model.png + :width: 66px + :height: 66px + +.. |icon-flow| image:: ../../images/icons/icon_flow.png + :width: 66px + :height: 66px + +.. |icon-job| image:: ../../images/icons/icon_job.png + :width: 66px + :height: 66px + +.. note:: + Because Model and Data objects refer to and describe a persistent external asset which TRAC controls (model code & data records) these objects can also be called "Assets". + + + +Virtual Deployment +---------- +TRAC uses a ‘virtual model deployment' approach in which all model code resides in an external repository +until it is needed for a calculation, so th virtual deployment is therefore crystalised at runtime. There are three main steps involved in the virtual deployment approach. + +.. list-table:: + :widths: 30 200 + + * - **IMPORT MODELS** + - Uploading a model creates a model object in the TRAC metadata store which includes a schema representation of the model. The model code remains in the repository. + + * - **BUILD FLOW** + - Flows can be built and validated using the schema representation of the models. Because the flows themselves exist only as metadata object, we can describe a flow as being a ‘virtual’ deployment of the model into a complex execution process. + + * - **RUN JOBS** + - To execute a RunFlow job you pick a flow and select the data and model objects to use for each node in the flow, plus any required model parameters. TRAC then fetches the model code from the repository and the data records from storage and executes the job. + + + +Models can be deployed and used with no coding or platform-level interventions if they contain the required +schema function. + + +.. list-table:: + :widths: 30 200 + + * - **INPUTS** + - The schema of the data inputs the model needs to run + + * - **PARAMETERS** + - The schema of any parameters which influence how the model runs, which should be provided at runtime. + + * - **OUTPUTS** + - The schema of the output data which the model generates. + +.. note:: + See :ref:`modelling` for more details on the TRAC Model API how to build TRAC-ready models. + + +The existence of a properly declared model schema is confirmed when importing a model onto TRAC using +an ImportModel job. When constructing a flow, the platform validates that the proposed graph is consistent +with the schemas of the model objects. Finally, when executing a RunModel or RunFlow job, TRAC validates +that the model code generates outputs which are consistent with the declared schema. + + +TRAC Guarantee +____________ + +A central feature of the platform is the control environment it creates, which is built on immutabilty and repeatabiltiy. This is embodied by three things: + +.. list-table:: + :widths: 45 60 200 + + * - |icon-audit| + - **AUDITABLE** + - Every action that changes a tag or an object is recorded in a fully time-consistent fashion + in the metadata model, so a complete version history is maintained by default. + + * - |icon-repeat| + - **REPEATABLE** + - Any RunModel or RunFlow job can be re-resubmitted and because the inputs are + immutable, TRAC can repeat calculation and deliver the same result, guaranteed. + + * - |icon-persist| + - **RISK FREE** + - Every version of every object (model, data, flow) remains permanently available to use and there is + no possibility of accidental loss or damage to deployed assets, so there is no change risk. + +.. |icon-audit| image:: ../../images/icons/icon_audit.png + :width: 66px + :height: 66px + +.. |icon-repeat| image:: ../../images/icons/icon_repeat.png + :width: 66px + :height: 66px + +.. |icon-persist| image:: ../../images/icons/icon_persist.png + :width: 66px + :height: 66px + +.. note:: + The repeatability guarantee does not apply to an ImportData job because changes in the external data source may mean that different data is brought across, and a model cannot be imported twice so an ImportModel job cannot be repeated. + + +Some other useful features +____________ + + - **Automated governance documentation** - The metadata is designed to br easily understood by + both humans and machines and is fully controlled and searchable. Standard report formats can be + used to create governance-ready documentation for model implementation oversight, data lineage + reporting and internal audit. + + - **Tweak and repeat** - Old jobs can be loaded up into the same tools used to create them originally, + because the metadata format is the same. They can then be edited and resubmitted with any desired + changes. Run last year's models with this year's data, or a series of what-if scenarios. + If the new data and models are not compatible, TRAC will explain exactly what the differences are. + + - **Parallel runs, parallel versions** - TRAC can execute as many parallel runs as the underlying compute + infrastructure will allow. Because the runs are isolated and stateless, multiple runs can use different + versions of the same model or the same dataset at the same time. + + - **Combine model versions** - It is even possible to load different versions of the same model code within + a single run. This can be useful to run challenger versions of individual components in a long model + chain, or if some model components are versioned independently. TRAC handles the complexity of loading + multiple versions of the same codebase into the executor process. diff --git a/doc/unused/tags.rst b/doc/unused/tags.rst new file mode 100644 index 000000000..4a54dccf2 --- /dev/null +++ b/doc/unused/tags.rst @@ -0,0 +1,191 @@ + +Tags +---- + + +:class:`Tags` are the core informational element of TRAC’s metadata model, they are +used to index, describe and control objects. Every object has a tag and each tag refers to a single object, +i.e. there is a one-to-one association. + +A tag is made up of: + + * A header that identifies the tag and associated object + * A set of attributes (key-value pairs) + * The associated object definition + +The object definition may sometimes be omitted, for example search results for metadata queries +do not include the full object definition. + +Here is an example of a set of tag attributes to illustrate some ways they can be used:: + + # A descriptive field intended for human users. + + display_name: "Customer accounts for March 2020, corrected April 6th" + + # A classification that can be used for searching or indexing. + # Client applications can also use this to find datasets of a certain + # type; typically an application will define a set of attributes that are + # "structural", i.e. the application uses those attributes to decide which + # objects to present for certain purposes. + + dataset_class: "customer_accounts" + + # Properties of an item can be added as individual attributes so they can + # be searched and displayed individually. This avoids the anti-pattern of + # putting multiple attributes into a single name/label field: + # customer_accounts_mar20_scotland_commercial_approved + + accounting_date: (DATE) 2020-03-31 + region: "Scotland" + book: "commercial_property" + figures_approved: (BOOLEAN) true + + # Attributes can be multi-valued. This can be helpful for applying + # regulatory classifiers, where multiple classifiers may apply to a + # single item. + + data_classification: ["confidential", "gdpr_pii", "audited"] + + # TRAC records a number of "controlled" attributes, these are set by the + # platform and cannot be modified directly through the metadata API. + # Controlled attributes start with the prefix "trac_". + + trac_create_time: (DATETIME) 2020-04-01 10:37:05 + trac_create_user_id: "jane.doe" + trac_create_user_name: "Jane Doe" + +Tag attributes are created and updated using :class:`TagUpdate` operations. +Tag updates are instructions to add, replace, append (for multi-valued attributes) or delete an attribute. +These instructions can be supplied when an object is created or updated, in which case TRAC will fill +in some attributes automatically (timestamp, sign-off state etc). It is also possible to update tags +without changing the associated object, for example to reclassify a dataset or change a description. + + +Versioning +---------- + +Versioning is supported for both objects and tags. For objects, versions are a series of immutable +copies where TRAC guarantees compatibility and continuity between versions. The general principal +for compatibility is that new versions will work in place of old versions (i.e. object versions are +backwards-compatible, but the reverse is not necessarily true) and for continuity is that the object +should describe the same resource. The exact requirements for these rules vary depending on object type. + +Of particular interest are data updates. In this case, updates can include (1) adding a delta to a +dataset, (2) providing a new snapshot of a dataset (3) adding a partition or (4) updating a partition +with a new snapshot or delta. A new version of the metadata object is created that refers to the new set +of primary data files, including any that are unchanged from the previous version. For example if a delta +is added, the new data definition would refer to all the files referenced in the previous version, plus +the new delta. + +A series of tag versions is assigned to every object version. Let's illustrate this with an example:: + + v = 1, t = 1 # Initial creation of an object + # Let's say it's a dataset containing customer data for some date T0 + + v = 1, t = 2 # Add a tag attribute, extra_attr = "some_value" + + v = 2, t = 1 # Corrections are applied to the data, so a new object version is created + # By default the attributes from v=1, t=2 are copied to the new tag + + v = 3, t = 1 # Data is added for a second day T1, in a separate partition + + v = 2, t = 2 # The data for T0 is signed off and the policy service updates the sign-off tag + # The tag applies to object version 2, which includes data for T0 with the corrections + +Object and tag versions are given numbers as shown here, they are also given timestamps which are +recorded by the system when a new object or tag version is created. Either a version number or a +timestamp can be used to uniquely identify versions for both objects and tags. + + +Selectors +--------- + +A :class:`TagSelector ` refers to a single object ID and identifies a specific +object version and tag version for that object. They are used throughout the TRAC platform whenever an +object is referenced, so it is always possible to specify versions using these selection criteria. The +available criteria are: + + 1. | Select the latest available version + | - *Variable selector, will return a different result when an object or tag is updated to a new version* + + 2. | Select a fixed version number + | - *Fixed selector, will always return the same result* + + 3. | Select the version for a previous point in time + | - *Fixed selector, will always return the same result* + +Selectors are used in API calls, for example reading a single object from the metadata API uses a tag selector. +Sending API calls with selectors referring to a previous point in time allows client applications to display a +consistent historical view of the platform. + +Selectors are also stored in the metadata model to express links between objects. For example, a job definition +uses tag selectors to identify the inputs and models that will be used to execute the job. In the case of a +job definition, the selectors are always stored as fixed selectors to indicate the precise object versions +used; if the user submits a job requesting the latest version of a model or input, TRAC will convert that +selector to a fixed selector before storing the job definition. + +Selectors refer to object and tag versions independently and there is no requirement to use the same selection +criteria for both. A selector for objectVersion = 3 with latestTag = true is perfectly valid, this could be +used for example to check the current sign-off state of a particular version of a model. + + +Queries +------- + +The TRAC metadata can be searched using logical expressions to match against tag attributes. Version +and/or timestamp information can also be included as search parameters. It is not possible to search the +contents of an object definition; any properties of an object that are needed for searching must be set +as tag attributes to make them available for metadata queries. + +A search expression is a logical combination of search terms that can be built up as an expression tree. +The logical operators available are AND, OR and NOT. A search term matches an individual attribute using +one of the available search operators. + + +.. list-table:: + :header-rows: 1 + :widths: 75 500 + + * + - Operator + - Meaning + + * - **EQ** == + - | Matches an attribute exactly. The attribute must be present and have the correct type and value. + If the attribute is multi-valued, EQ will match if any of the values match. + | *EQ may behave erratically for floating point attributes, using EQ, NE or IN with float values + is not recommended.* + + * - **NE** != + - The logical inverse of EQ, matches precisely when EQ does not match. If the search attribute is + not present, NE will match. If the search attribute is multi-value, NE will match only when none + of the values match. + + * - **IN** + - attr IN [a, b, c] is equivalent to attr == a OR attr = b OR attr = c. If the attribute is multi- + valued, IN will match if any of the search values match any of the attribute values. + + * - + | **GT** > + | **GE** >= + | **LT** < + | **LE** <= + + - Ordered comparisons, for ordered data types only. The attribute must be present and the type must + match the search type (comparing an integer to a float, or a date to a date-time value will not match). + Ordered comparisons will never match if the search attribute is multi-valued. + + +By default, only the latest versions of objects and tags are considered in a search. Even if a prior version +of an object or tag version would have matched, that prior version is not considered. There are options in the +search parameters to include prior versions, in which case all matching versions of an object or tag will be +returned. + +All searches can optionally be run as-of a previous point in time, which will cause the search to ignore +metadata generated after that time. These searches still have the option to include prior versions if +required. Using this feature allows clients to show a consistent historical view of the platform for +functionality that relies on metadata queries. + +For the full API reference on metadata searches, see the reference pages for +:class:`SearchParameters` and +:meth:`TracMetadataApi.search()`. From 42afc705a24841f87185a13f47f60890a01d18ff Mon Sep 17 00:00:00 2001 From: a-frankl Date: Wed, 6 Nov 2024 13:27:09 +0000 Subject: [PATCH 3/5] punctuation --- README.md | 27 +++++++++++++-------------- doc/index.rst | 3 ++- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bea848f0a..32a78e280 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,25 @@ # ![TRAC Data & Analytics Platform](doc/_images/tracdap_horizontal_400.png) -*A next-generation data and analytics platform for use in highly regulated environments* +*The modern model platform for complex, critical models and calculations.* [![FINOS - Incubating](https://cdn.jsdelivr.net/gh/finos/contrib-toolbox@master/images/badge-incubating.svg)](https://finosfoundation.atlassian.net/wiki/display/FINOS/Incubating) -TRAC D.A.P. brings a step change in performance, insight, flexibility and control -compared to conventional analytics platforms. By redrawing the boundary -between business and technology, modellers and business users are given easy -access to modern, open source tools that can execute at scale, while technology -integrations and operational concerns are cleanly separated and consolidated -across use cases. +TRAC is a universal model orchestration solution designed for the most complex, critical +and highly-governed use cases. It combines your existing data and compute infrastructure, +model development environments and the repository of versioned code, to create a single ecosystem +in which to build and deploy models, orchestrate complex workflows and run analytics. -At the core of a platform, a flexible metadata model allows data and models to -be catalogued, plugged together and shared across the business. Using the -principal of immutability, TRAC allows new data structures and model pipelines -to be created, updated and executed at any time without change risk to production -workflows, guaranteeing total repeatability, audit and control (TRAC). +TRAC is designed to break the trade-off that has traditionally been required, between flexible +(but uncontrolled) analytics solutions and highly controlled (but inflexible) production platforms. +It offers best of both worlds, power, control and analytical flexibility. +The core platform services - i.e. TRAC Data & Analytics Platform (or TRAC D.A.P.) - are maintained by +`finTRAC Limited `_ in association with the `finos Foundation `_ +under the `Apache Software License version 2.0 `_. ## Documentation and Packages -Documentation for the TRAC platform is available on our website at -[tracdap.finos.org](https://tracdap.finos.org). +Documentation for the TRAC D.A.P platform is available on our website at [tracdap.finos.org](https://tracdap.finos.org). The following packages are available: @@ -31,6 +29,7 @@ The following packages are available: | [Web API package](https://www.npmjs.com/package/@finos/tracdap-web-api) | Build client apps in JavaScript or TypeScript using the TRAC platform APIs | | [Platform releases](https://github.com/finos/tracdap/releases) | Packages for the platform services and a standalone sandbox are published with each release on GitHub | +Commercially supported deployments of TRAC are separately available from `finTRAC Limited `_. ## Development Status diff --git a/doc/index.rst b/doc/index.rst index 5cd3d37c9..f463de4f1 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -11,7 +11,8 @@ The core platform services - i.e. TRAC Data & Analytics Platform (or TRAC D.A.P. under the `Apache Software License version 2.0 `_. This documentation site focuses on how to deploy the TRAC D.A.P. services and build both models and -applications which leverage those services. Commercially supported deployments of TRAC are separately available from `finTRAC Limited `_. +applications which leverage those services. Commercially supported deployments of TRAC are separately +available from `finTRAC Limited `_. .. note:: From 47dbddcaff37f32bdfd1c1c146d27da3e3020e96 Mon Sep 17 00:00:00 2001 From: a-frankl Date: Wed, 6 Nov 2024 13:29:16 +0000 Subject: [PATCH 4/5] punctuation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32a78e280..155109554 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![FINOS - Incubating](https://cdn.jsdelivr.net/gh/finos/contrib-toolbox@master/images/badge-incubating.svg)](https://finosfoundation.atlassian.net/wiki/display/FINOS/Incubating) -TRAC is a universal model orchestration solution designed for the most complex, critical +TRAC is a universal model orchestration solution which is designed for the most complex, critical and highly-governed use cases. It combines your existing data and compute infrastructure, model development environments and the repository of versioned code, to create a single ecosystem in which to build and deploy models, orchestrate complex workflows and run analytics. From bbf2da2879f8329d7c1318118f67f6015be77477 Mon Sep 17 00:00:00 2001 From: a-frankl Date: Wed, 6 Nov 2024 13:31:23 +0000 Subject: [PATCH 5/5] Update to readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 155109554..e128226ef 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ model development environments and the repository of versioned code, to create a in which to build and deploy models, orchestrate complex workflows and run analytics. TRAC is designed to break the trade-off that has traditionally been required, between flexible -(but uncontrolled) analytics solutions and highly controlled (but inflexible) production platforms. -It offers best of both worlds, power, control and analytical flexibility. +(but uncontrolled) analytics solutions and highly controlled (but inflexible) production model +platforms. It offers best of both worlds, power, control and analytical flexibility. The core platform services - i.e. TRAC Data & Analytics Platform (or TRAC D.A.P.) - are maintained by `finTRAC Limited `_ in association with the `finos Foundation `_