Metadata-Version: 2.4
Name: h2o_mlops
Version: 1.5.2
Summary: Python client for H2O MLOps.
Author-email: "H2O.ai" <support@h2o.ai>
License: Apache v2
Project-URL: Documentation, https://docs.h2o.ai/mlops/py-client/overview
Project-URL: Changelog, https://docs.h2o.ai/mlops/release-notes
Keywords: h2o,mlops
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: backports.strenum>=1.3.1; python_version < "3.11"
Requires-Dist: certifi>=2024.7.4
Requires-Dist: h2o-authn>=2.0.1
Requires-Dist: h2o-cloud-discovery>=2.0.0
Requires-Dist: h2o-secure-store>=1.3.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: markdown>=3.8
Requires-Dist: tabulate>=0.9.0
Requires-Dist: urllib3<3.0.0,>=2.1.0
Requires-Dist: yarl>=1.9.4
Requires-Dist: lazy-imports<2,>=1
Requires-Dist: pydantic>=2
Requires-Dist: python-dateutil>=2.8.2
Requires-Dist: typing-extensions>=4.7.1
Provides-Extra: pyspark
Requires-Dist: pyspark>=3.5.0; extra == "pyspark"
Requires-Dist: pyarrow>=19.0.0; extra == "pyspark"
Requires-Dist: numpy>=2.2.0; extra == "pyspark"
Requires-Dist: pandas>=2.2.0; extra == "pyspark"
Dynamic: license-file

# An H2O MLOps Python Client

## Example

```
import h2o_mlops
import h2o_mlops.options as options
import h2o_mlops.types as types
```

First, we need to connect to MLOps. In the default case, the client detects credentials and configuration options from the environment.

```
mlops = h2o_mlops.Client()
```

Alternatively, you can initialize the client explicitly by passing the required parameters.

```
mlops = h2o_mlops.Client(
    h2o_cloud_url=<H2O_CLOUD_URL>,
    refresh_token=<REFRESH_TOKEN>,
    ssl_cacert="/path/to/your/ca_certificate.pem",  # If SSL is not needed, you can omit it.
)
```

Replace `<H2O_CLOUD_URL>` and `<REFRESH_TOKEN>` with your actual values.

### Everything Starts with a Workspace

A workspace is the main base of operations for most MLOps activities.

```
workspace = mlops.workspaces.create(name="demo")
```

```
mlops.workspaces.list(name="demo")
```

        | name   | uid
    ----+--------+--------------------------------------
      0 | demo   | 45e5a888-ec1f-4f9c-85ca-817465344b1f

You can also do `workspace = mlops.workspaces.get(uid=...)`.

### Upload an Experiment

```
experiment = workspace.experiments.create(
    data="/path/to/your/model.zip",
    name="experiment-from-client"
)
```

Some experiment attributes of interest.

```
experiment.uid
```

    'e307aa9f-895f-4b07-9404-b0728d1b7f03'

Existing experiments can be viewed and retrieved.

```
workspace.experiments.list()
```

        | name                   | uid                                  | tags
    ----+------------------------+--------------------------------------+--------
      0 | experiment-from-client | e307aa9f-895f-4b07-9404-b0728d1b7f03 |

You can also do `experiment = workspaces.experiments.get(uid=...)`.

### Create a Model

```
model = workspace.models.create(name="model-from-client")
```

Existing models can be viewed and retrieved.

```
workspace.models.list()
```

        | name              | uid
    ----+-------------------+--------------------------------------
      0 | model-from-client | d18a677f-b800-4a4b-8642-0f59e202d225

You can also do `model = workspaces.models.get(uid=...)`.

### Register an Experiment to a Model

In order to deploy a model, it needs to have experiments registered to it.

```
model.register(experiment=experiment)
```

```
model.versions()
```

        |   version | experiment_uid
    ----+-----------+--------------------------------------
      0 |         1 | e307aa9f-895f-4b07-9404-b0728d1b7f03

```
model.experiment(model_version="latest").name
```

    'experiment-from-client'

### Deployment

#### What is needed for a single model deployment?
- workspace
- model
- scoring runtime
- security options
- name for deployment

We already have a `workspace` and `model`. Next we'll get the `scoring_runtime` for our model type, from the scoring runtime suggestions for the experiment to select the appropriate one.

```
model.experiment().scoring_runtimes
```

        | name              | artifact_type   | uid
    ----+-------------------+-----------------+-------------------
      0 | H2O-3 MOJO scorer | h2o3_mojo       | h2o3_mojo_runtime

```
scoring_runtime = model.experiment().scoring_runtimes[0]
```

Now we can create a deployment.

```
deployment = workspace.deployments.create(
    name="deployment-from-client",
    composition_options=options.CompositionOptions(
        model=model,
        scoring_runtime=scoring_runtime,
    ),
    security_options=options.SecurityOptions(
        security_type=types.SecurityType.DISABLED,
    ),
)

deployment.wait_for_healthy()
    
deployment.state
```

    'HEALTHY'

### Score

Once you have a deployment, you can score with it through the HTTP protocol.

```
scorer = deployment.scorer

scorer.score(
    payload=scorer.sample_request(auth_value=...),
    auth_value=...,
)
```

    {'fields': ['C11.0', 'C11.1'],
     'id': 'e307aa9f-895f-4b07-9404-b0728d1b7f03',
     'score': [['0.49786656666743145', '0.5021334333325685']]}
