diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0ae92ae..e03205c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,4 +1,4 @@ -name: "Analyse withCodeQL" +name: analyse with CodeQL on: push: diff --git a/.vscode/settings.json b/.vscode/settings.json index 99a8cc7..8f43709 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "cSpell.words": [ "alru", "Analyse", + "AndrĂ¡s", "basereload", "boto", "botocore", @@ -75,5 +76,6 @@ "python.linting.pylintEnabled": false, "python.linting.mypyEnabled": true, "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "editor.wordWrap": "on" } diff --git a/README.md b/README.md index 1672bd4..e0d26c8 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,19 @@ -# ![logo](docs/media/favicon.ico) GreatAI - -[![Sonar line coverage](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=coverage)](https://sonar.scoutinscience.com/dashboard?id=great-ai) -[![Sonar LoC](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=ncloc)](https://sonar.scoutinscience.com/dashboard?id=great-ai) -[![Test](https://github.com/schmelczer/great-ai/actions/workflows/test.yml/badge.svg)](https://github.com/schmelczer/great-ai/actions/workflows/test.yml) +# logo of great-ai GreatAI +> Easily transform your prototype AI code into production-ready software. + [![PyPI version](https://badge.fury.io/py/great-ai.svg)](https://badge.fury.io/py/great-ai) [![Downloads](https://pepy.tech/badge/great-ai/month)](https://pepy.tech/project/great-ai) ![Docker Pulls](https://img.shields.io/docker/pulls/schmelczera/great-ai) +[![Test](https://github.com/schmelczer/great-ai/actions/workflows/test.yml/badge.svg)](https://github.com/schmelczer/great-ai/actions/workflows/test.yml) +[![Sonar line coverage](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=coverage)](https://sonar.scoutinscience.com/dashboard?id=great-ai) +[![Sonar LoC](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=ncloc)](https://sonar.scoutinscience.com/dashboard?id=great-ai) + +Applying AI is becoming increasingly easier but many case studies have shown that these applications are often deployed poorly. This may lead to suboptimal performance and to introducing unintended biases. GreatAI helps fixing this by allowing you to easily transform your prototype AI code into production-ready software. -GreatAI helps you easily transform your prototype AI code into production-ready software. [Check out the full documentation here](https://great-ai.scoutinscience.com). +## Example + ```sh pip install great-ai ``` @@ -34,7 +38,7 @@ That's it. Your GreatAI service is ready for production use. Many of the [SE4ML ![scope of GreatAI](docs/media/scope-simple.drawio.svg) -GreatAI fits between the prototype and deployment phases of your (or your organisation's) AI development lifecycle. This is highlighted with blue in the diagram. Here, a number of best practices can be automatically implemented aiming to achieve the following attributes: +GreatAI fits between the prototype and deployment phases of your AI development lifecycle. This is highlighted with blue in the diagram. Here, a number of best practices can be automatically implemented aiming to achieve the following attributes: - **G**eneral: use any Python library without restriction - **R**obust: have error-handling and well-tested utilities out-of-the-box @@ -48,16 +52,16 @@ There are other, existing solutions aiming to facilitate this phase. [Amazon Sag However, [research indicates](https://great-ai.scoutinscience.com) that professionals rarely use them. This may be due to their inherent setup and operating complexity. **GreatAI is designed to be as simple to use as possible.** Its clear, high-level API and sensible default configuration makes it extremely easy to start using. Despite its relative simplicity over Seldon Core, it still implements many of the [SE4ML best-practices](https://se-ml.github.io), and thus, can meaningfully improve your deployment without requiring prohibitively large effort. +## Learn more + +[Check out the documentation](https://great-ai.scoutinscience.com). + ## Find `great-ai` on [DockerHub](https://hub.docker.com/repository/docker/schmelczera/great-ai) ```sh docker run -p6060:6060 schmelczera/great-ai ``` -## Learn more - -[Check out the documentation](https://great-ai.scoutinscience.com). - ## Contribute Contributions are welcome. @@ -67,12 +71,18 @@ Contributions are welcome. ```sh python3 -m venv --copies .env source .env/bin/activate -python3 -m pip install flit -python3 -m flit install --symlink --deps=all +pip install flit +flit install --symlink --deps=all +``` + +### Run tests + +```sh +pytest --doctest-modules --asyncio-mode=strict ``` ### Serve documentation ```sh -mkdocs serve --dirtyreload +mkdocs serve ``` diff --git a/docs/index.md b/docs/index.md index 7939208..dd70e37 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,13 +3,12 @@ -[![Sonar line coverage](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=coverage)](https://sonar.scoutinscience.com/dashboard?id=great-ai) -[![Sonar LoC](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=ncloc)](https://sonar.scoutinscience.com/dashboard?id=great-ai) -[![Test](https://github.com/schmelczer/great-ai/actions/workflows/test.yml/badge.svg)](https://github.com/schmelczer/great-ai/actions/workflows/test.yml) [![PyPI version](https://badge.fury.io/py/great-ai.svg)](https://badge.fury.io/py/great-ai) [![Downloads](https://pepy.tech/badge/great-ai/month)](https://pepy.tech/project/great-ai) ![Docker Pulls](https://img.shields.io/docker/pulls/schmelczera/great-ai) - +[![Test](https://github.com/schmelczer/great-ai/actions/workflows/test.yml/badge.svg)](https://github.com/schmelczer/great-ai/actions/workflows/test.yml) +[![Sonar line coverage](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=coverage)](https://sonar.scoutinscience.com/dashboard?id=great-ai) +[![Sonar LoC](https://sonar.scoutinscience.com/api/project_badges/measure?project=great-ai&metric=ncloc)](https://sonar.scoutinscience.com/dashboard?id=great-ai) Applying AI is becoming increasingly easier but many case studies have shown that these applications are often deployed poorly. This may lead to suboptimal performance and to introducing [unintended biases](https://en.wikipedia.org/wiki/Weapons_of_Math_Destruction){ target=_blank }. GreatAI helps fixing this by allowing you to ==easily transform your prototype AI code into production-ready software==. @@ -32,7 +31,7 @@ Applying AI is becoming increasingly easier but many case studies have shown tha - [x] Input validation - [x] Sensible cache-policy - [x] Seamless support for both synchronous and `async` inference methods -- [x] Easy integration with other remote GreatAI instances +- [x] Easy integration with remote GreatAI instances - [x] Built-in parallelisation (with support for multiprocessing, async, and mixed modes) for batch processing - [x] Well-tested utilities for common NLP tasks (cleaning, language-tagging, sentence-segmentation, etc.) - [x] A simple, unified configuration interface @@ -41,6 +40,11 @@ Applying AI is becoming increasingly easier but many case studies have shown tha - [x] Docker support for deployment - [x] Deployable Jupyter Notebooks - [x] Dashboard for high-level overview and analysing traces + +## Roadmap + +- [ ] Prometheus & Grafana integration +- [ ] Well-tested feature extraction code for non-NLP data - [ ] Support for direct file input - [ ] Support for PostgreSQL @@ -66,7 +70,7 @@ def hello_world(name: str) -> str: #(2) 2. [Typing functions](https://docs.python.org/3/library/typing.html){ target=_blank } is recommended in general, however, not required for GreatAI to work. ??? note - In practice, `hello_world` could be an inference function of some AI/ML application. But it could also just wrap a black-box solution of some SaaS. Either ways, it is imperative to have continuos oversight of the services you provide and data you process. + In practice, `hello_world` could be an inference function of some AI/ML application. But it could also just wrap a black-box solution of some SaaS. Either ways, it is [imperative to have continuos oversight](https://digital-strategy.ec.europa.eu/en/library/ethics-guidelines-trustworthy-ai){ target=_blank } of the services you provide and data you process especially in the context of AI/ML applications. ```sh title="terminal" great-ai hello-world.py @@ -98,18 +102,20 @@ GreatAI fits between the prototype and deployment phases of your (or your organi There are other, existing solutions aiming to facilitate this phase. [Amazon SageMaker](https://aws.amazon.com/sagemaker){ target=_blank } and [Seldon Core](https://www.seldon.io/solutions/open-source-projects/core){ target=_blank } provide the most comprehensive suite of features. If you have the opportunity use those, do that because they're great. -However, research indicates that professionals rarely use them. This may be due to their inherent setup and operating complexity. GreatAI is designed to be as simple to use as possible. Its clear, high-level API and sensible default configuration makes it extremely easy to start using. Despite its relative simplicity over Seldon Core, it still implements many of the [SE4ML best-practices](https://se-ml.github.io){ target=_blank }, and thus, can meaningfully improve your deployment without requiring prohibitively large effort. +However, research indicates that professionals rarely use them. This may be due to their inherent setup and operating complexity. ==GreatAI is designed to be as simple to use as possible.== Its clear, high-level API and sensible default configuration makes it extremely easy to start using. Despite its relative simplicity over Seldon Core, it still implements many of the [SE4ML best-practices](https://se-ml.github.io){ target=_blank }, and thus, can meaningfully improve your deployment without requiring prohibitively large effort. -
+
[:fontawesome-brands-python: Find it on PyPI](https://pypi.org/project/great-ai){ .md-button .md-button--primary } [:fontawesome-brands-docker: Find it on DockerHub](https://hub.docker.com/repository/docker/schmelczera/great-ai){ .md-button .md-button--primary } + +[:fontawesome-solid-laptop-code: Check out the tutorial](/tutorial){ .md-button .md-button--primary }
## Production use GreatAI has been battle-tested on the core platform services of [ScoutinScience](https://www.scoutinscience.com/){ target=_blank }. -![ScoutinScience logo](media/scoutinscience.svg#only-light){ loading=lazy } -![ScoutinScience logo](media/scoutinscience-white.svg#only-dark){ loading=lazy } +[![ScoutinScience logo](media/scoutinscience.svg#only-light){ loading=lazy } +![ScoutinScience logo](media/scoutinscience-white.svg#only-dark){ loading=lazy }](https://www.scoutinscience.com/){ target=_blank } diff --git a/docs/media/og-image.png b/docs/media/og-image.png new file mode 100644 index 0000000..da71b20 Binary files /dev/null and b/docs/media/og-image.png differ diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 702c96b..4b15dba 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -1,6 +1,22 @@ {% extends "base.html" %} +{% block extrahead %} + + + + + + + + +{% endblock %} + {% block content %} + {% if page.nb_url %} {% include ".icons/material/download.svg" %} diff --git a/pyproject.toml b/pyproject.toml index 303f43a..1e9b0cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,7 +68,8 @@ dev = [ ] [project.urls] -Homepage = "https://github.com/schmelczer/great-ai" +Documentation = "https://great-ai.scoutinscience.com" +GitHub = "https://github.com/schmelczer/great-ai" DockerHub = "https://hub.docker.com/repository/docker/schmelczera/great-ai" [project.scripts]