Skip to content

Commit eb70d6d

Browse files
authored
Merge pull request #60 from JuliaAI/pairing-mlflow-v3
Pairing mlflow v3
2 parents c03c83b + f3c73e4 commit eb70d6d

File tree

21 files changed

+350
-157
lines changed

21 files changed

+350
-157
lines changed

.github/workflows/CI.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,22 @@ jobs:
2626
if: hashFiles('**/requirements.txt', '**/pyproject.toml') == ''
2727
run: |
2828
touch ./requirements.txt
29-
echo "mlflow==2.20.1" > ./requirements.txt
29+
echo "mlflow[auth]==3.2.0" > ./requirements.txt
3030
- uses: actions/setup-python@v4
3131
with:
3232
python-version: '3.12.3'
3333
cache: 'pip'
3434
- name: Setup mlflow locally
3535
run: |
36+
export MLFLOW_FLASK_SERVER_SECRET_KEY='mlflowclient.jl'
3637
pip install -r ./requirements.txt
3738
python3 /opt/hostedtoolcache/Python/3.12.3/x64/bin/mlflow server --app-name basic-auth --host 0.0.0.0 --port 5000 &
3839
sleep 5
3940
- uses: julia-actions/setup-julia@v1
4041
with:
4142
version: ${{ matrix.version }}
4243
arch: ${{ matrix.arch }}
43-
- uses: actions/cache@v1
44+
- uses: actions/cache@v4
4445
env:
4546
cache-name: cache-artifacts
4647
with:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[![Build Status](https://github.com/JuliaAI/MLFlowClient.jl/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/JuliaAI/MLFlowClient.jl/actions/workflows/CI.yml?query=branch%3Amain)
55
[![Coverage](https://codecov.io/gh/JuliaAI/MLFlowClient.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/JuliaAI/MLFlowClient.jl)
66

7-
Julia client for [MLFlow](https://www.mlflow.org/) `2.20.1` (but should work with other versions as well).
7+
Julia client for [MLFlow](https://www.mlflow.org/) `3.2.0` (but should work with other versions as well).
88

99
- [x] Supports tracking of metrics, parameters, tags, artifacts, and models.
1010
- [x] Compatible with latest MLFlow server capabilities.

docs/src/reference/logger.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ logmetric
44
logbatch
55
loginputs
66
logparam
7+
logmodel
78
```

docs/src/reference/types.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
```@docs
33
MLFlow
44
Tag
5-
ViewType
6-
RunStatus
7-
ModelVersionStatus
85
Dataset
96
DatasetInput
107
FileInfo
@@ -19,7 +16,6 @@ RunData
1916
RunInfo
2017
RunInputs
2118
User
22-
Permission
2319
ExperimentPermission
2420
RegisteredModelPermission
2521
```

src/MLFlowClient.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,17 @@ include("types/tag.jl")
2626
export Tag
2727

2828
include("types/enums.jl")
29-
export ViewType, RunStatus, ModelVersionStatus, Permission
29+
export ViewType, RunStatus, ModelVersionStatus, Permission, DeploymentJobRunState, State
3030

3131
include("types/dataset.jl")
3232
export Dataset, DatasetInput
3333

3434
include("types/artifact.jl")
3535
export FileInfo
3636

37-
include("types/model_version.jl")
38-
export ModelVersion
37+
include("types/model.jl")
38+
export ModelInput, ModelMetric, ModelOutput, ModelParam, ModelVersion,
39+
ModelVersionDeploymentJobState
3940

4041
include("types/registered_model.jl")
4142
export RegisteredModel, RegisteredModelAlias, RegisteredModelPermission
@@ -64,7 +65,7 @@ export getrun, createrun, deleterun, setruntag, updaterun, restorerun, searchrun
6465
deleteruntag
6566

6667
include("services/logger.jl")
67-
export logbatch, loginputs, logmetric, logparam
68+
export logbatch, loginputs, logmetric, logmodel, logparam
6869

6970
include("services/artifact.jl")
7071
export listartifacts

src/services/experiment.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,15 @@ updateexperiment(instance::MLFlow, experiment::Experiment, new_name::String)::Bo
156156
- `order_by`: List of columns for ordering search results, which can include [`Experiment`](@ref)
157157
name and id with an optional “DESC” or “ASC” annotation, where “ASC” is the default.
158158
- `view_type`: Qualifier for type of experiments to be returned. If unspecified, return
159-
only active experiments. For more values, see [`ViewType`](@ref).
159+
only active experiments.
160160
161161
# Returns
162162
- Vector of [`Experiment`](@ref) that were found in the [`MLFlow`](@ref) instance.
163163
- The next page token if there are more results.
164164
"""
165165
function searchexperiments(instance::MLFlow; max_results::Int64=20000,
166166
page_token::String="", filter::String="", order_by::Array{String}=String[],
167-
view_type::ViewType=ACTIVE_ONLY)::Tuple{Array{Experiment},Union{String,Nothing}}
167+
view_type::ViewType.ViewTypeEnum=ViewType.ACTIVE_ONLY)::Tuple{Array{Experiment},Union{String,Nothing}}
168168
parameters = (; max_results, page_token, filter, :view_type => view_type |> Integer)
169169

170170
if order_by |> !isempty
@@ -220,22 +220,22 @@ setexperimenttag(instance::MLFlow, experiment::Experiment, key::String,
220220
- `instance`: [`MLFlow`](@ref) configuration.
221221
- `experiment_id`: [`Experiment`](@ref) id.
222222
- `username`: [`User`](@ref) username.
223-
- `permission`: [`Permission`](@ref) to grant.
223+
- `permission`: Permission to grant.
224224
225225
# Returns
226226
An instance of type [`ExperimentPermission`](@ref).
227227
"""
228228
function createexperimentpermission(instance::MLFlow, experiment_id::String,
229-
username::String, permission::Permission)::ExperimentPermission
229+
username::String, permission::Permission.PermissionEnum)::ExperimentPermission
230230
result = mlfpost(instance, "experiments/permissions/create";
231231
experiment_id=experiment_id, username=username, permission=permission)
232232
return result["experiment_permission"] |> ExperimentPermission
233233
end
234234
createexperimentpermission(instance::MLFlow, experiment_id::Integer,
235-
username::String, permission::Permission)::ExperimentPermission =
235+
username::String, permission::Permission.PermissionEnum)::ExperimentPermission =
236236
createexperimentpermission(instance, experiment_id |> string, username, permission)
237237
createexperimentpermission(instance::MLFlow, experiment::Experiment,
238-
username::String, permission::Permission)::ExperimentPermission =
238+
username::String, permission::Permission.PermissionEnum)::ExperimentPermission =
239239
createexperimentpermission(instance, experiment.experiment_id, username, permission)
240240

241241
"""
@@ -276,22 +276,22 @@ getexperimentpermission(instance::MLFlow, experiment::Experiment,
276276
- `instance`: [`MLFlow`](@ref) configuration.
277277
- `experiment_id`: [`Experiment`](@ref) id.
278278
- `username`: [`User`](@ref) username.
279-
- `permission`: [`Permission`](@ref) to grant.
279+
- `permission`: Permission to grant.
280280
281281
# Returns
282282
`true` if successful. Otherwise, raises exception.
283283
"""
284284
function updateexperimentpermission(instance::MLFlow, experiment_id::String,
285-
username::String, permission::Permission)::Bool
285+
username::String, permission::Permission.PermissionEnum)::Bool
286286
mlfpatch(instance, "experiments/permissions/update"; experiment_id=experiment_id,
287287
username=username, permission=permission)
288288
return true
289289
end
290290
updateexperimentpermission(instance::MLFlow, experiment_id::Integer,
291-
username::String, permission::Permission)::Bool =
291+
username::String, permission::Permission.PermissionEnum)::Bool =
292292
updateexperimentpermission(instance, experiment_id |> string, username, permission)
293293
updateexperimentpermission(instance::MLFlow, experiment::Experiment,
294-
username::String, permission::Permission)::Bool =
294+
username::String, permission::Permission.PermissionEnum)::Bool =
295295
updateexperimentpermission(instance, experiment.experiment_id, username, permission)
296296

297297
"""

src/services/logger.jl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ For more information about this function, check [MLFlow official documentation](
5757
- `params`: A collection of [`Param`](@ref) to log.
5858
- `tags`: A collection of [`Tag`](@ref) to log.
5959
60-
**Note**: A single request can contain up to 1000 metrics, and up to 1000 metrics, params,
61-
and tags in total.
60+
!!! note
61+
A single request can contain up to 1000 metrics, and up to 1000 metrics, params, and
62+
tags in total.
6263
6364
# Returns
6465
`true` if successful. Otherwise, raises exception.
@@ -123,3 +124,18 @@ logparam(instance::MLFlow, run_id::String, param::Param)::Bool =
123124
logparam(instance, run_id, param.key, param.value)
124125
logparam(instance::MLFlow, run::Run, param::Param)::Bool =
125126
logparam(instance, run.info.run_id, param.key, param.value)
127+
128+
"""
129+
logmodel(instance::MLFlow, run_id::String, model_json::String)
130+
131+
# Arguments
132+
- `instance`: [`MLFlow`](@ref) configuration.
133+
- `run_id`: ID of the [`Run`](@ref) to log under.
134+
- `model_json`: MLmodel file in json format.
135+
"""
136+
function logmodel(instance::MLFlow, run_id::String, model_json::String)::Bool
137+
mlfpost(instance, "runs/log-model"; run_id=run_id, model_json=model_json)
138+
return true
139+
end
140+
logmodel(instance::MLFlow, run::Run, model_json::String)::Bool =
141+
logmodel(instance, run.info.run_id, model_json)

src/services/misc.jl

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,31 @@ Get a list of all values for the specified [`Metric`](@ref) for a given [`Run`](
1010
- `metric_key`: Name of the [`Metric`](@ref) to fetch.
1111
- `page_token`: Token indicating the page of [`Metric`](@ref) history to fetch.
1212
- `max_results`: Maximum number of logged instances of a [`Metric`](@ref) for a
13-
[`Run`](@ref) to return per call.
13+
[`Run`](@ref) to return per call. Defaults to 50.
1414
1515
# Returns
1616
- A list of all historical values for the specified [`Metric`](@ref) in the specified
1717
[`Run`](@ref).
1818
- The next page token if there are more results.
1919
"""
2020
function getmetrichistory(instance::MLFlow, run_id::String, metric_key::String;
21-
page_token::String="", max_results::Union{Int64,Missing}=missing
21+
page_token::Union{String,Missing}=missing, max_results::Int64=50
2222
)::Tuple{Array{Metric},Union{String,Nothing}}
2323
result = mlfget(instance, "metrics/get-history"; run_id=run_id, metric_key=metric_key,
2424
page_token=page_token,
2525
max_results=(ismissing(max_results) ? max_results : (max_results |> Int32)))
2626

27-
metrics = result["metrics"] |> (x -> [Metric(y) for y in x])
27+
metrics = get(result, "metrics", []) |> (x -> [Metric(y) for y in x])
2828
next_page_token = get(result, "next_page_token", nothing)
2929

3030
return metrics, next_page_token
3131
end
3232
getmetrichistory(instance::MLFlow, run::Run, metric_key::String; page_token::String="",
33-
max_results::Union{Int64,Missing}=missing
34-
)::Tuple{Array{Metric},Union{String,Nothing}} =
33+
max_results::Int64=50)::Tuple{Array{Metric},Union{String,Nothing}} =
3534
getmetrichistory(instance, run.info.run_id, metric_key; page_token=page_token,
3635
max_results=max_results)
3736
getmetrichistory(instance::MLFlow, run::Run, metric::Metric; page_token::String="",
38-
max_results::Union{Int64,Missing}=missing
39-
)::Tuple{Array{Metric},Union{String,Nothing}} =
37+
max_results::Int64=50)::Tuple{Array{Metric},Union{String,Nothing}} =
4038
getmetrichistory(instance, run.info.run_id, metric.key; page_token=page_token,
4139
max_results=max_results)
4240

src/services/registered_model.jl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ name already exists.
1717
An instance of type [`RegisteredModel`](@ref).
1818
"""
1919
function createregisteredmodel(instance::MLFlow, name::String;
20-
tags::MLFlowUpsertData{Tag}=Tag[],
21-
description::Union{String,Missing}=missing)::RegisteredModel
20+
tags::MLFlowUpsertData{Tag}=Tag[], description::Union{String,Missing}=missing,
21+
deployment_job_id::Union{String,Missing}=missing)::RegisteredModel
2222
result = mlfpost(instance, "registered-models/create"; name=name,
23-
tags=parse(Tag, tags), description=description)
23+
tags=parse(Tag, tags), description=description,
24+
deployment_job_id=deployment_job_id)
2425
return result["registered_model"] |> RegisteredModel
2526
end
2627

@@ -199,13 +200,13 @@ end
199200
- `instance:` [`MLFlow`](@ref) configuration.
200201
- `name:` [`RegisteredModel`](@ref) name.
201202
- `username:` [`User`](@ref) username.
202-
- `permission:` [`Permission`](@ref) to grant.
203+
- `permission:` Permission to grant.
203204
204205
# Returns
205206
An instance of type [`RegisteredModelPermission`](@ref).
206207
"""
207208
function createregisteredmodelpermission(instance::MLFlow, name::String, username::String,
208-
permission::Permission)::RegisteredModelPermission
209+
permission::Permission.PermissionEnum)::RegisteredModelPermission
209210
result = mlfpost(instance, "registered-models/permissions/create"; name=name,
210211
username=username, permission=permission)
211212
return result["registered_model_permission"] |> RegisteredModelPermission
@@ -237,13 +238,13 @@ end
237238
- `instance:` [`MLFlow`](@ref) configuration.
238239
- `name:` [`RegisteredModel`](@ref) name.
239240
- `username:` [`User`](@ref) username.
240-
- `permission:` New [`Permission`](@ref) to grant.
241+
- `permission:` New permission to grant.
241242
242243
# Returns
243244
`true` if successful. Otherwise, raises exception.
244245
"""
245246
function updateregisteredmodelpermission(instance::MLFlow, name::String, username::String,
246-
permission::Permission)::Bool
247+
permission::Permission.PermissionEnum)::Bool
247248
mlfpatch(instance, "registered-models/permissions/update"; name=name, username=username,
248249
permission=permission)
249250
return true

src/services/run.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ Search for runs that satisfy expressions. Search expressions can use [`Metric`](
170170
- The next page token if there are more results.
171171
"""
172172
function searchruns(instance::MLFlow; experiment_ids::Array{String}=String[],
173-
filter::String="", run_view_type::ViewType=ACTIVE_ONLY, max_results::Int=1000,
174-
order_by::Array{String}=String[],
173+
filter::String="", run_view_type::ViewType.ViewTypeEnum=ViewType.ACTIVE_ONLY,
174+
max_results::Int=1000, order_by::Array{String}=String[],
175175
page_token::String="")::Tuple{Array{Run},Union{String,Nothing}}
176176
parameters = (; experiment_ids, filter, :run_view_type => run_view_type |> Integer,
177177
max_results, page_token)
@@ -207,13 +207,14 @@ Update [`Run`](@ref) metadata.
207207
- An instance of type [`RunInfo`](@ref) with the updated metadata.
208208
"""
209209
function updaterun(instance::MLFlow, run_id::String;
210-
status::Union{RunStatus,Missing}=missing, end_time::Union{Int64,Missing}=missing,
211-
run_name::Union{String,Missing})::RunInfo
210+
status::Union{RunStatus.RunStatusEnum,Missing}=missing,
211+
end_time::Union{Int64,Missing}=missing, run_name::Union{String,Missing})::RunInfo
212212
result = mlfpost(instance, "runs/update"; run_id=run_id, status=(status |> Integer),
213213
end_time=end_time, run_name=run_name)
214214
return result["run_info"] |> RunInfo
215215
end
216-
updaterun(instance::MLFlow, run::Run; status::Union{RunStatus,Missing}=missing,
216+
updaterun(instance::MLFlow, run::Run;
217+
status::Union{RunStatus.RunStatusEnum,Missing}=missing,
217218
end_time::Union{Int64,Missing}=missing, run_name::Union{String,Missing})::RunInfo =
218219
updaterun(instance, run.info.run_id; status=status, end_time=end_time,
219220
run_name=run_name)

0 commit comments

Comments
 (0)