From 96274dbcff1c7705e2c04305f080c0f5c9118d3d Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Perez Date: Tue, 24 May 2022 00:48:19 -0600 Subject: [PATCH 1/9] docs: add some admonitions --- content/docs/api-reference/pack.md | 36 +++++++++++++----------- content/docs/command-reference/link.md | 8 ++++-- content/docs/command-reference/pprint.md | 6 +++- content/docs/contributing/core.md | 6 +++- content/docs/index.md | 14 +++++---- 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/content/docs/api-reference/pack.md b/content/docs/api-reference/pack.md index 4bfa4806..6b6fd6a6 100644 --- a/content/docs/api-reference/pack.md +++ b/content/docs/api-reference/pack.md @@ -20,22 +20,6 @@ from mlem.api import pack pack("pip", "rf", target="build", package_name="example_mlem_get_started") ``` -> The extra kwargs supplied above can be seen from the output of -> `mlem types packager pip` which gives us -> -> ```py -> [required] package_name: str -> [required] target: str -> [not required] templates_dir: str = [] -> [not required] python_version: str = None -> [not required] short_description: str = "" -> [not required] url: str = "" -> [not required] email: str = "" -> [not required] author: str = "" -> [not required] version: str = "0.0.0" -> [not required] additional_setup_kwargs: typing.Any = {} -> ``` - ## Description This API is the underlying mechanism for the @@ -43,6 +27,26 @@ This API is the underlying mechanism for the programmatically create ship-able assets from MlemModels such as pip-ready packages, docker images, etc. + + +The arguments supplied to this method can be found with `mlem types`: + +```cli +$ mlem types packager pip +[required] package_name: str +[required] target: str +[not required] templates_dir: str = [] +[not required] python_version: str = None +[not required] short_description: str = "" +[not required] url: str = "" +[not required] email: str = "" +[not required] author: str = "" +[not required] version: str = "0.0.0" +[not required] additional_setup_kwargs: typing.Any = {} +``` + + + ## Parameters - **`packager`** (required) - Packager to use. Out-of-the-box supported string diff --git a/content/docs/command-reference/link.md b/content/docs/command-reference/link.md index 12111d50..44a2c366 100644 --- a/content/docs/command-reference/link.md +++ b/content/docs/command-reference/link.md @@ -44,8 +44,12 @@ Add a remote object to your local workspace (aka repo) without copying it $ mlem link rf --source-repo https://github.com/iterative/example-mlem-get-started remote_model ``` -> The remote model can now be served with the link created above, using the -> command `mlem serve remote_model fastapi`. + + +The remote model can now be served with the link created above, using the +command `mlem serve remote_model fastapi`. + + Alias a local object with a different name diff --git a/content/docs/command-reference/pprint.md b/content/docs/command-reference/pprint.md index abce41b0..69cecc06 100644 --- a/content/docs/command-reference/pprint.md +++ b/content/docs/command-reference/pprint.md @@ -22,7 +22,11 @@ as object specific information such as `methods` for a `model` or `reader` for a Since only one specific object is printed, a `PATH` to the specific MLEM object is always required. -> You can use [`mlem list`](/doc/command-reference/list) to list MLEM objects. + + +You can use [`mlem list`](/doc/command-reference/list) to list MLEM objects. + + ## Options diff --git a/content/docs/contributing/core.md b/content/docs/contributing/core.md index 142192ea..cf20db50 100644 --- a/content/docs/contributing/core.md +++ b/content/docs/contributing/core.md @@ -46,7 +46,11 @@ Make sure that you have Python 3.7 or higher installed. On macOS, we recommend using `brew` to install Python. For Windows, we recommend an official [python.org release](https://www.python.org/downloads/windows/). -> ℹ️ Note that `pip` version 20.3+ is required. + + +`pip` version 20.3+ is required. + + Install MLEM in editable mode with `pip install -e ".[tests]"`. But before we do that, we **strongly** recommend creating a diff --git a/content/docs/index.md b/content/docs/index.md index 19216928..007b5b1e 100644 --- a/content/docs/index.md +++ b/content/docs/index.md @@ -4,11 +4,15 @@ It seamlessly supports a variety of scenarios like real-time serving and batch processing. -> 💡 When combined with [GTO](https://github.com/iterative/gto), MLEM allows you -> to create a powerful Model Registry out of your Git repository! Such a -> registry serves as a centralized place to store and operationalize your models -> along with their metadata; manage model life-cycle, versions & releases, and -> easily automate tests and deployments using GitOps. + + +💡 When combined with [GTO](https://github.com/iterative/gto), MLEM allows you +to create a powerful Model Registry out of your Git repository! Such a registry +serves as a centralized place to store and operationalize your models along with +their metadata; manage model life-cycle, versions & releases, and easily +automate tests and deployments using GitOps. + + From ad2abfdb9381db5452f17453b7be843406f20122 Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Perez Date: Tue, 24 May 2022 02:27:34 -0600 Subject: [PATCH 2/9] start/cases/guide: review notes (block quotes) --- content/docs/get-started/deploying.md | 20 +++++---- content/docs/get-started/saving.md | 4 +- content/docs/use-cases/dvc.md | 10 ++--- content/docs/use-cases/index.md | 2 +- content/docs/user-guide/basic-concepts.md | 10 ++--- content/docs/user-guide/datasets.md | 12 +++--- content/docs/user-guide/linking.md | 12 +++--- content/docs/user-guide/mlem-abcs.md | 20 +++++---- content/docs/user-guide/project-structure.md | 45 +++++++------------- 9 files changed, 62 insertions(+), 73 deletions(-) diff --git a/content/docs/get-started/deploying.md b/content/docs/get-started/deploying.md index 229e55d7..ce707539 100644 --- a/content/docs/get-started/deploying.md +++ b/content/docs/get-started/deploying.md @@ -1,6 +1,8 @@ # Deploying models -You can also create deployments in cloud from your models. +You can create deployments in the cloud from your models. This uses packaging +and serving functions under the hood. For example, Heroku deployment combines +Docker image packaging with FastAPI serving. > ⚠️ This functionality is experimental and is subject to change. We’ll add more > target platforms in upcoming releases. @@ -40,18 +42,20 @@ $ mlem create env heroku staging -c api_key= ## Defining deployment Now, as we defined our target env, we can deploy our model there. Deployments -are also MLEM objects, which means that they need to have their definition. To -create one for Heroku, we once again will use `create` command to configure our -deployment. +are also MLEM objects, which means that they need to have their definition. + +To create one for Heroku, we once again will use `create` command to configure +our deployment. We use `example-mlem-get-started` for the app name, but you can +change it to something unique: ```cli -$ mlem create deployment heroku myservice -c app_name=example-mlem-get-started -c model=rf -c env=staging +$ mlem create deployment heroku myservice \ + -c app_name=example-mlem-get-started \ + -c model=rf \ + -c env=staging 💾 Saving deployment to .mlem/deployment/service_name.mlem ``` -> 💡 We use `example-mlem-get-started` for app_name, but you should change it to -> something unique. -
### ⛳ [Create deployment definition](https://github.com/iterative/example-mlem-get-started/tree/5-deploy-meta) diff --git a/content/docs/get-started/saving.md b/content/docs/get-started/saving.md index 7b4dccd6..98c23aec 100644 --- a/content/docs/get-started/saving.md +++ b/content/docs/get-started/saving.md @@ -193,8 +193,8 @@ It's a bit long, but we can see all that we need to use the model later: 3. Requirements: `sklearn`, `numpy`, `pandas` with particular versions we need to run this model. -> Note that we didn't specify requirements: MLEM investigates the object you're -> saving (even if it's a complex one) and finds out all requirements needed. +Note that we didn't specify requirements: MLEM investigates the object you're +saving (even if it's a complex one) and finds out all requirements needed!
diff --git a/content/docs/use-cases/dvc.md b/content/docs/use-cases/dvc.md index 82877719..e9ec329d 100644 --- a/content/docs/use-cases/dvc.md +++ b/content/docs/use-cases/dvc.md @@ -4,15 +4,15 @@ ### 🧳 Requirements -`pip install mlem dvc[azure]` +```cli +$ pip install mlem dvc[azure] +```
Often it’s a bad idea to store binary files in Git, especially big ones. To -solve this MLEM can utilize DVC capabilities to connect external cloud storage -for model and dataset versioning. - -> You can learn more about DVC [here](https://dvc.org/doc). +solve this MLEM can utilize [DVC](https://dvc.org/doc) capabilities to connect +external cloud storage for model and dataset versioning. We will reorganize our example repo to use DVC. diff --git a/content/docs/use-cases/index.md b/content/docs/use-cases/index.md index 9c2d0445..e5c6878b 100644 --- a/content/docs/use-cases/index.md +++ b/content/docs/use-cases/index.md @@ -30,7 +30,7 @@ If you train Machine Learning models and you want to MLEM is for you! > We keep reviewing our docs and will include interesting scenarios that surface -> in the community. Please, contact us if you need help or have suggestions! +> in the community. Please contact us if you need help or have suggestions! Please choose from the navigation sidebar to the left, or click the Next button below ↘ diff --git a/content/docs/user-guide/basic-concepts.md b/content/docs/user-guide/basic-concepts.md index ee6fba26..affae667 100644 --- a/content/docs/user-guide/basic-concepts.md +++ b/content/docs/user-guide/basic-concepts.md @@ -42,16 +42,14 @@ See also [MLEM Object API](/doc/api-reference/mlem-object) ## Common fields -Each MLEM Object has `object_type` field which determines the type of the -object. Different types have different additional fields and methods, but all -MLEM Objects have the following fields: +Each MLEM Object has an `object_type` field which determines the type of the +object. Specific types may additional properties, but all MLEM Objects have the +following fields: - `description` - for storing user-provided description - `params` - arbitrary object with additional parameters - `tags` - list of string tags - -> Also, when you load MLEM Object via API, it will have `location` field that -> holds information from where you loaded this object +- `location` - if the object is loaded, information about where it came from You can check out what methods MLEM Objects have in [API Reference](/doc/api-reference/mlem-object) diff --git a/content/docs/user-guide/datasets.md b/content/docs/user-guide/datasets.md index 413013e4..f28d9559 100644 --- a/content/docs/user-guide/datasets.md +++ b/content/docs/user-guide/datasets.md @@ -1,4 +1,4 @@ -# WIP Woring with datasets +# WIP Working with datasets ## Getting the data @@ -96,6 +96,10 @@ which were used to save the dataset. That doesn't mean you can't read that `train` any other way, but if you would use MLEM to load it, it would know that it needs pandas to do that for you. +Note that we didn't specify whether the saved dataset was `pd.DataFrame`, +`np.array` or `tf.Tensor`. MLEM is getting that for you, and this handy magic +extends to ML models 👋 +
### ⛳ [Data prepared](https://github.com/iterative/example-mlem-get-started/tree/2-prepare) @@ -107,9 +111,3 @@ $ git diff 2-prepare ```
- -# --------- - -> Note that we didn't specify whether the saved dataset was `pd.DataFrame`, -> `np.array` or `tf.Tensor`. MLEM is getting that for you, and this handy magic -> extends to ML models 👋 diff --git a/content/docs/user-guide/linking.md b/content/docs/user-guide/linking.md index 9097e6a6..a25e6a8b 100644 --- a/content/docs/user-guide/linking.md +++ b/content/docs/user-guide/linking.md @@ -1,9 +1,9 @@ # Links -Another powerful feature of MLEM if MLEM Links. Links are special lightweight -MLEM Objects that represent MLEM Objects in different locations. That means you -can [reference](/doc/user-guide/project-structure#referencing-mlem-objects) -links everywhere you need to specify MLEM Object. +Another powerful feature of MLEM is linking. Links are lightweight objects that +represent MLEM Objects in other locations. You can +[reference](/doc/user-guide/project-structure#referencing-mlem-objects) links +anywhere you need to specify MLEM Object bot in API and CLI. > Since MLEM Links are also a type of MLEM Objects, they share the same logic, > for example they are saved under `.mlem/link` directory. To load and instance @@ -24,8 +24,8 @@ fields: ## Using links Links can be created via [`mlem link`](/doc/command-reference/link) or -[`mlem.api.link`](/doc/api-reference/link) commands, as well as -`MlemMeta.make_link` method. +[`mlem.api.link`](/doc/api-reference/link) commands, as well as the +`MlemMeta.make_link()` method. > You can create relative links inside the same repository, which will basically > create an alias for that object. diff --git a/content/docs/user-guide/mlem-abcs.md b/content/docs/user-guide/mlem-abcs.md index 60ef56b6..074733cd 100644 --- a/content/docs/user-guide/mlem-abcs.md +++ b/content/docs/user-guide/mlem-abcs.md @@ -5,7 +5,7 @@ MLEM has a number of abstract base classes that anyone can implement to
-### Internal details +## Internal details Each abstract base class in this list is a subclass of `mlem.core.base.MlemABC` class, which is a subclass of pydantic `BaseModel` with additional polymorphic @@ -21,12 +21,14 @@ via `-c` notation in CLI. > are not saved when you dump the objects. After loading objects with such > fields they will be empty until you somehow "load" the object. -> Fields marked as **lazy** are used to hold implementation-related objects and -> are not deserialized right away when you load parent object. This helps avoid -> `ImportError` if you do not have dependencies required for undelying -> implementation, or just to avoid unneccessary imports. The field value will be -> loaded when you try to access it. If you don't want to load it, you can access -> unserialized data in `_raw` field. + Here is the list of all MLEM ABCs. @@ -81,8 +83,8 @@ this is what you implement! **Base class**: `mlem.core.model.ModelType` -> This class is polymorphic, which means it can have more fields depending on -> implementation. +> This class is polymorphic, which means that it can have more fields depending +> on implementation. **Fields**: diff --git a/content/docs/user-guide/project-structure.md b/content/docs/user-guide/project-structure.md index febac298..bf77d1e2 100644 --- a/content/docs/user-guide/project-structure.md +++ b/content/docs/user-guide/project-structure.md @@ -1,41 +1,28 @@ # Project structure -## MLEM Repo +## MLEM Project -MLEM can work with any `.mlem` files anywhere, but if you are using Git it is -worth to turn your repo into a **MLEM Repo**. +Any directory with a valid `.mlem/` directory is considered a **MLEM Project**. +To create one, use [`mlem init`](/doc/command-reference/init) or +[`mlem.api.init`](/doc/api-reference/init). This will also create an empty +`config.yaml` (see [Configuration](/doc/user-guide/configuration)). -Having a **MLEM Repo** will allow you to save config options and index your -objects. Also it will bring some structure to your project and help you address -objects more easily. +> Some API and CLI commands like `mlem ls` and `mlem config` require this +> execution context. But in general, MLEM can work with `.mlem` files anywhere. -> Of course, you can create MLEM Repo even without Git, because actually any -> path with a `.mlem` directory is considered **MLEM Repo** whether it is local, -> on GitHub or on some cloud file storage. +A common place to initialize MLEM is a data science Git repository. _MLEM +repositories_ help you better structure and easily address existing data +artifacts (especially ML models). And Git allows you to version MLEM objects and +configuration options along with code. -Once you have **MLEM Repo**, you will be able to use API and CLI commands that -require it like `mlem ls` and `mlem config`. +## Internal vs. External objects -## mlem init - -To create **MLEM Repo**, simply run [`mlem init`](/doc/command-reference/init) -or [`mlem.api.init`](/doc/api-reference/init). It accepts path as an argument, -which defaults to current directory. - -It will create `.mlem` directory and an empty `config.yaml` file inside. You can -learn more about configuration [here](/doc/user-guide/configuration). - -## External objects - -By default, any objects that you save into repo will be **internal**, which +By default, any MLEM objects that you save into repo will be **internal**, which means they will be saved under `.mlem/{object type}/`. -If you don't want this behavior, you can specify `external` flag when saving or -set `default_external` to `True` via configuration. After that saved objects -will be **external** and they will be saved under the path you specify. - -Also, they will be indexed via links under `.mlem/link/`. -That is needed for MLEM to keep track of all MLEM Objects in the repo. +To save objects anywhere, use the `external` flag when saving them or set +`default_external=True` via configuration. **External** objects will be indexed +via links under `.mlem/link/`. > You can also turn this off via `link=False` flag, but in that case your object > will not appear in `mlem ls` output for example. From 64278b71a17ef8ab63db8c403674a92733884d0a Mon Sep 17 00:00:00 2001 From: Jorge Orpinel Perez Date: Tue, 24 May 2022 02:28:22 -0600 Subject: [PATCH 3/9] more admonitions! (done) --- content/docs/get-started/deploying.md | 47 ++++++++++++++------ content/docs/get-started/saving.md | 12 +++-- content/docs/user-guide/basic-concepts.md | 9 ++-- content/docs/user-guide/extending.md | 8 +++- content/docs/user-guide/importing.md | 8 +++- content/docs/user-guide/linking.md | 20 ++++++--- content/docs/user-guide/mlem-abcs.md | 18 +++++--- content/docs/user-guide/project-structure.md | 17 +++++-- 8 files changed, 99 insertions(+), 40 deletions(-) diff --git a/content/docs/get-started/deploying.md b/content/docs/get-started/deploying.md index ce707539..23e4d5c3 100644 --- a/content/docs/get-started/deploying.md +++ b/content/docs/get-started/deploying.md @@ -4,12 +4,11 @@ You can create deployments in the cloud from your models. This uses packaging and serving functions under the hood. For example, Heroku deployment combines Docker image packaging with FastAPI serving. -> ⚠️ This functionality is experimental and is subject to change. We’ll add more -> target platforms in upcoming releases. + -Deployment often uses packaging and serving functionalities. For example, Heroku -deployment that is showcased in this section actually uses docker image -packaging with FastAPI serving. +This functionality is experimental and is subject to change. + + ## Defining target environment @@ -36,8 +35,12 @@ $ mlem create env heroku staging -c api_key= 💾 Saving env to .mlem/env/staging.mlem ``` -> Note that api_key argument is optional and MLEM will use `HEROKU_API_KEY` env -> variable if you don’t provide it via config. + + +MLEM will attempt to use the `HEROKU_API_KEY` environment variable if no +`api_key` argument is provided. + + ## Defining deployment @@ -92,10 +95,18 @@ $ mlem deploy create myservice ✅ Service example-mlem-get-started is up. You can check it out at https://my-mlem-service.herokuapp.com/ ``` -> 💡 You can also create and configure deployment on-the-fly using `-c` options -> for `mlem deploy create` command: -> -> `$ mlem deploy create service_name -m model -t staging -c app_name=example-mlem-get-started` + + +You can also define and run the deployment on-the-fly using `-c` options for +`mlem deploy create`, e.g.: + +```cli +$ mlem deploy create myservice \ + -m model -t staging \ + -c app_name=example-mlem-get-started +``` + +
@@ -145,9 +156,17 @@ $ mlem deploy apply myservice test_x.csv --json [1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0] ``` -> 💡 As always, you don’t need to have deployment meta locally: -> -> `$ mlem deploy apply https://github.com/iterative/example-mlem-get-started/myservice https://github.com/iterative/example-mlem-get-started/test_x.csv --json` + + +You don’t even need to have the deployment metadata locally: + +```cli +$ mlem deploy apply --json \ + https://github.com/iterative/example-mlem-get-started/myservice \ + https://github.com/iterative/example-mlem-get-started/test_x.csv +``` + + ## Managing deployment diff --git a/content/docs/get-started/saving.md b/content/docs/get-started/saving.md index 98c23aec..e9ea63c3 100644 --- a/content/docs/get-started/saving.md +++ b/content/docs/get-started/saving.md @@ -45,15 +45,21 @@ Now let's run this script and see how we save the model. ```cli $ python train.py +... + $ tree .mlem/model/ .mlem/model ├── rf └── rf.mlem ``` -> By default, MLEM saves your files to `.mlem/` directory, but that could be -> changed, see [project structure](/doc/user-guide/project-structure) for -> reference. + + +By default, MLEM saves your files to `.mlem/` directory, but that can be +changed. See [Project Structure](/doc/user-guide/project-structure) for more +details. + + What we see here is that model was saved along with some metadata about it: `rf` containing the model binary and `.mlem` file containing metadata. Let's take a diff --git a/content/docs/user-guide/basic-concepts.md b/content/docs/user-guide/basic-concepts.md index affae667..5afed8e1 100644 --- a/content/docs/user-guide/basic-concepts.md +++ b/content/docs/user-guide/basic-concepts.md @@ -6,11 +6,12 @@ The most important concept in MLEM is **MLEM Object**. Basically, MLEM is a library to create, manage and use different **MLEM Objects**, such as models, datasets and other types you can read about below. -> So, when you use `save` API method, you create MLEM Object from an arbitrary -> supported Python object. + -> Also, MLEM Objects can be created with -> [`mlem create`](/doc/command-reference/create) CLI command +For example, when you use `mlem.api.save()`, you create a MLEM Object from a +supported Python structure. MLEM Objects can also be created with `mlem create`. + + MLEM Objects are saved as `.mlem` files in `yaml` format. Sometimes they can have other files attached to them, in that case we call `.mlem` file as a diff --git a/content/docs/user-guide/extending.md b/content/docs/user-guide/extending.md index 3f62fd03..d71c00df 100644 --- a/content/docs/user-guide/extending.md +++ b/content/docs/user-guide/extending.md @@ -66,8 +66,12 @@ dynamically, depending on what is imported in user's environment. For example, 2. After importing mlem, user imported `sklearn` 3. User loaded any object that uses any of `sklearn` extension implementation. -> Note that some of the fields in MlemObjects are lazy, which mean they will be -> loaded only if users accesses them. + + +Some of the fields in MLEM Objects are lazy, which means that they will be +loaded only if users accesses them. + + ## Subclassing MlemConfig diff --git a/content/docs/user-guide/importing.md b/content/docs/user-guide/importing.md index 9ca7b311..e6cbbaac 100644 --- a/content/docs/user-guide/importing.md +++ b/content/docs/user-guide/importing.md @@ -6,8 +6,12 @@ Objects, you can use [`mlem import`](/doc/command-reference/import) or They will try to load the path you provided and analyze the object saved there. -> Obviously, importing is more limited than `save` API, since MLEM do not have -> live python object to analyze and tries to recreate it, which may fail. + + +Importing is more limited than `mlem.api.save()`. This is because MLEM does not +have a live Python object to analyze and tries to recreate it, which may fail. + + You can see list of available import implementations [here](/doc/user-guide/mlem-abcs#importhook). diff --git a/content/docs/user-guide/linking.md b/content/docs/user-guide/linking.md index a25e6a8b..b9d7fa4e 100644 --- a/content/docs/user-guide/linking.md +++ b/content/docs/user-guide/linking.md @@ -5,10 +5,14 @@ represent MLEM Objects in other locations. You can [reference](/doc/user-guide/project-structure#referencing-mlem-objects) links anywhere you need to specify MLEM Object bot in API and CLI. -> Since MLEM Links are also a type of MLEM Objects, they share the same logic, -> for example they are saved under `.mlem/link` directory. To load and instance -> of `MlemLink` (and not the object it references) provide `follow_links=False` -> to `load_meta` method. + + +Since links are also a type of MLEM Object, they share the same internal logic. +For example, they are saved under the `.mlem/link` directory. To load and +instance of `MlemLink` (and not the object it references) provide +`follow_links=False` to `load_meta` method. + + ## Link structure @@ -27,8 +31,12 @@ Links can be created via [`mlem link`](/doc/command-reference/link) or [`mlem.api.link`](/doc/api-reference/link) commands, as well as the `MlemMeta.make_link()` method. -> You can create relative links inside the same repository, which will basically -> create an alias for that object. + + +You can create relative links inside the same repository, which will basically +create an alias for that object. + + Also, since links can target specific commits, tags or branches in a versioned repository, they can be used in a variety of different scenarios, for example to diff --git a/content/docs/user-guide/mlem-abcs.md b/content/docs/user-guide/mlem-abcs.md index 074733cd..031dc808 100644 --- a/content/docs/user-guide/mlem-abcs.md +++ b/content/docs/user-guide/mlem-abcs.md @@ -17,9 +17,13 @@ via `-c` notation in CLI.
-> Fields marked as **transient** are used to hold some operational object and -> are not saved when you dump the objects. After loading objects with such -> fields they will be empty until you somehow "load" the object. + + +**Transient** fields are used to hold some operational object and are not saved +when an object is dumped. After opening objects with transient fields they will +be empty until you load the object. + +