Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
matrix:
version:
- '1.10'
- '1.11'
- '1' # automatically expands to the latest stable 1.x release of Julia.
os:
- ubuntu-latest
Expand Down
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "MLFlowClient"
uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83"
authors = ["@deyandyankov, @pebeto, and contributors"]
version = "0.7.0"
version = "0.7.1"

[deps]
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
Expand All @@ -15,7 +15,7 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
[compat]
Base64 = "1.0"
HTTP = "1.0"
JSON = "0.21"
JSON = "0.21,1"
ShowCases = "0.1"
URIs = "1.0"
julia = "1.0"
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
[![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)
[![Coverage](https://codecov.io/gh/JuliaAI/MLFlowClient.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/JuliaAI/MLFlowClient.jl)

Julia client for [MLFlow](https://www.mlflow.org/) `3.2.0` (but should work with other versions as well).
Julia client for [MLFlow](https://www.mlflow.org/) `3.2.0`. Use with later versions at
your own risk. For example, there is [this known
issue](https://github.com/JuliaAI/MLFlowClient.jl/issues/76).

- [x] Supports tracking of metrics, parameters, tags, artifacts, and models.
- [x] Compatible with latest MLFlow server capabilities.
Expand Down
4 changes: 2 additions & 2 deletions src/types/dataset.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct Dataset
schema::Union{String,Nothing}
profile::Union{String,Nothing}
end
Dataset(data::Dict{String,Any}) = Dataset(data["name"], data["digest"],
Dataset(data::AbstractDict{String}) = Dataset(data["name"], data["digest"],
data["source_type"], data["source"], get(data, "schema", nothing),
get(data, "profile", nothing))
Base.show(io::IO, t::Dataset) = show(io, ShowCase(t, new_lines=true))
Expand All @@ -38,6 +38,6 @@ struct DatasetInput
tags::Array{Tag}
dataset::Dataset
end
DatasetInput(data::Dict{String,Any}) = DatasetInput(
DatasetInput(data::AbstractDict{String}) = DatasetInput(
[Tag(tag) for tag in get(data, "tags", [])], Dataset(data["dataset"]))
Base.show(io::IO, t::DatasetInput) = show(io, ShowCase(t, new_lines=true))
4 changes: 2 additions & 2 deletions src/types/experiment.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct Experiment
creation_time::Int64
tags::Array{Tag}
end
Experiment(data::Dict{String,Any}) = Experiment(data["experiment_id"], data["name"],
Experiment(data::AbstractDict{String}) = Experiment(data["experiment_id"], data["name"],
data["artifact_location"], data["lifecycle_stage"], data["last_update_time"],
data["creation_time"], [Tag(tag) for tag in get(data, "tags", [])])
Base.show(io::IO, t::Experiment) = show(io, ShowCase(t, new_lines=true))
Expand All @@ -38,6 +38,6 @@ struct ExperimentPermission
user_id::String
permission::Permission.PermissionEnum
end
ExperimentPermission(data::Dict{String,Any}) = ExperimentPermission(data["experiment_id"],
ExperimentPermission(data::AbstractDict{String}) = ExperimentPermission(data["experiment_id"],
data["user_id"] |> string, Permission.parse(data["permission"]))
Base.show(io::IO, t::ExperimentPermission) = show(io, ShowCase(t, new_lines=true))
8 changes: 4 additions & 4 deletions src/types/mlflow.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Base type which defines location and version for MLFlow API service.
# Fields
- `apiroot::String`: API root URL, e.g. `http://localhost:5000/api`
- `apiversion::Union{Integer, AbstractFloat}`: used API version, e.g. `2.0`
- `headers::Dict`: HTTP headers to be provided with the REST API requests.
- `headers::AbstractDict`: HTTP headers to be provided with the REST API requests.
- `username::Union{Nothing, String}`: username for basic authentication.
- `password::Union{Nothing, String}`: password for basic authentication.

Expand Down Expand Up @@ -34,7 +34,7 @@ mlf = MLFlow(remote_url, headers=Dict("Authorization" => "Bearer <your-secret-to
struct MLFlow
apiroot::String
apiversion::AbstractFloat
headers::Dict
headers::AbstractDict
username::Union{Nothing,String}
password::Union{Nothing,String}

Expand Down Expand Up @@ -65,12 +65,12 @@ struct MLFlow
new(apiroot, apiversion, headers, username, password)
end
end
MLFlow(apiroot::String; apiversion::AbstractFloat=2.0, headers::Dict=Dict(),
MLFlow(apiroot::String; apiversion::AbstractFloat=2.0, headers::AbstractDict=Dict(),
username::Union{Nothing,String}=nothing,
password::Union{Nothing,String}=nothing)::MLFlow =
MLFlow(apiroot, apiversion, headers, username, password)
MLFlow(; apiroot::String="http://localhost:5000/api", apiversion::AbstractFloat=2.0,
headers::Dict=Dict(), username::Union{Nothing,String}=nothing,
headers::AbstractDict=Dict(), username::Union{Nothing,String}=nothing,
password::Union{Nothing,String}=nothing)::MLFlow =
MLFlow(apiroot, apiversion, headers, username, password)

Expand Down
2 changes: 1 addition & 1 deletion src/types/model.jl
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ struct ModelVersion
run_link::String
aliases::Array{String}
end
ModelVersion(data::Dict{String,Any}) = ModelVersion(data["name"], data["version"],
ModelVersion(data::AbstractDict{String}) = ModelVersion(data["name"], data["version"],
data["creation_timestamp"], data["last_updated_timestamp"],
get(data, "user_id", nothing), data["current_stage"], data["description"],
data["source"], data["run_id"], data["status"] |> ModelVersionStatus.parse,
Expand Down
6 changes: 3 additions & 3 deletions src/types/registered_model.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ struct RegisteredModelAlias
alias::String
version::String
end
RegisteredModelAlias(data::Dict{String,Any}) = RegisteredModelAlias(data["alias"],
RegisteredModelAlias(data::AbstractDict{String}) = RegisteredModelAlias(data["alias"],
data["version"])
Base.show(io::IO, t::RegisteredModelAlias) = show(io, ShowCase(t, new_lines=true))

Expand Down Expand Up @@ -45,7 +45,7 @@ struct RegisteredModel
deployment_job_id::Union{String,Nothing}
deployment_job_state::Union{State.StateEnum,Nothing}
end
RegisteredModel(data::Dict{String,Any}) = RegisteredModel(data["name"],
RegisteredModel(data::AbstractDict{String}) = RegisteredModel(data["name"],
data["creation_timestamp"], data["last_updated_timestamp"],
get(data, "user_id", nothing), get(data, "description", nothing),
[ModelVersion(version) for version in get(data, "latest_versions", [])],
Expand All @@ -68,6 +68,6 @@ struct RegisteredModelPermission
user_id::String
permission::Permission.PermissionEnum
end
RegisteredModelPermission(data::Dict{String,Any}) = RegisteredModelPermission(data["name"],
RegisteredModelPermission(data::AbstractDict{String}) = RegisteredModelPermission(data["name"],
data["user_id"] |> string, Permission.parse(data["permission"]))
Base.show(io::IO, t::RegisteredModelPermission) = show(io, ShowCase(t, new_lines=true))
14 changes: 7 additions & 7 deletions src/types/run.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ struct Metric <: LoggingData
timestamp::Int64
step::Union{Int64,Nothing}
end
Metric(data::Dict{String,Any}) = Metric(data["key"], data["value"], data["timestamp"],
Metric(data::AbstractDict{String}) = Metric(data["key"], data["value"], data["timestamp"],
data["step"])
Base.show(io::IO, t::Metric) = show(io, ShowCase(t, new_lines=true))

Expand All @@ -32,7 +32,7 @@ struct Param <: LoggingData
key::String
value::String
end
Param(data::Dict{String,Any}) = Param(data["key"], data["value"])
Param(data::AbstractDict{String}) = Param(data["key"], data["value"])
Base.show(io::IO, t::Param) = show(io, ShowCase(t, new_lines=true))

"""
Expand Down Expand Up @@ -64,7 +64,7 @@ struct RunInfo
artifact_uri::String
lifecycle_stage::String
end
RunInfo(data::Dict{String,Any}) = RunInfo(data["run_id"], data["run_name"],
RunInfo(data::AbstractDict{String}) = RunInfo(data["run_id"], data["run_name"],
data["experiment_id"], RunStatus.parse(data["status"]), data["start_time"],
get(data, "end_time", nothing), data["artifact_uri"], data["lifecycle_stage"])
Base.show(io::IO, t::RunInfo) = show(io, ShowCase(t, new_lines=true))
Expand All @@ -84,7 +84,7 @@ struct RunData
params::Array{Param}
tags::Array{Tag}
end
RunData(data::Dict{String,Any}) = RunData(
RunData(data::AbstractDict{String}) = RunData(
[Metric(metric) for metric in get(data, "metrics", [])],
[Param(param) for param in get(data, "params", [])],
[Tag(tag) for tag in get(data, "tags", [])])
Expand All @@ -102,7 +102,7 @@ struct RunInputs
dataset_inputs::Array{DatasetInput}
model_inputs::Array{ModelInput}
end
RunInputs(data::Dict{String,Any}) = RunInputs(
RunInputs(data::AbstractDict{String}) = RunInputs(
[DatasetInput(dataset_input) for dataset_input in get(data, "dataset_inputs", [])],
[ModelInput(model_input) for model_input in get(data, "model_inputs", [])])
Base.show(io::IO, t::RunInputs) = show(io, ShowCase(t, new_lines=true))
Expand All @@ -118,7 +118,7 @@ Outputs of a [`Run`](@ref).
struct RunOutputs
model_outputs::Array{ModelOutput}
end
RunOutputs(data::Dict{String,Any}) = RunOutputs(
RunOutputs(data::AbstractDict{String}) = RunOutputs(
[ModelOutput(model_output) for model_output in get(data, "model_outputs", [])])
Base.show(io::IO, t::RunOutputs) = show(io, ShowCase(t, new_lines=true))

Expand All @@ -139,6 +139,6 @@ struct Run
inputs::RunInputs
outputs::RunOutputs
end
Run(data::Dict{String,Any}) = Run(RunInfo(data["info"]), RunData(data["data"]),
Run(data::AbstractDict{String}) = Run(RunInfo(data["info"]), RunData(data["data"]),
RunInputs(data["inputs"]), RunOutputs(data["outputs"]))
Base.show(io::IO, t::Run) = show(io, ShowCase(t, new_lines=true))
2 changes: 1 addition & 1 deletion src/types/tag.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ struct Tag <: LoggingData
key::String
value::String
end
Tag(data::Dict{String,Any})::Tag = Tag(data["key"], data["value"] |> string)
Tag(data::AbstractDict{String})::Tag = Tag(data["key"], data["value"] |> string)
Base.show(io::IO, t::Tag) = show(io, ShowCase(t, new_lines=true))
2 changes: 1 addition & 1 deletion src/types/user.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct User
experiment_permissions::Array{ExperimentPermission}
registered_model_permissions::Array{RegisteredModelPermission}
end
User(data::Dict{String,Any}) = User(data["id"] |> string, data["username"], data["is_admin"],
User(data::AbstractDict{String}) = User(data["id"] |> string, data["username"], data["is_admin"],
[ExperimentPermission(permission) for permission in get(data, "experiment_permissions", [])],
[RegisteredModelPermission(permission) for permission in get(data, "registered_model_permissions", [])])
Base.show(io::IO, t::User) = show(io, ShowCase(t, new_lines=true))
2 changes: 1 addition & 1 deletion src/utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const MLFlowUpsertData{T} = Union{Array{T},Array{<:Dict{String,<:Any}},
Array{<:Tuple{String,<:NumberOrString}}}

function dict_to_T_array(::Type{T},
dict::Dict{String,<:NumberOrString}) where {T<:LoggingData}
dict::AbstractDict{String,<:NumberOrString}) where {T<:LoggingData}
entities = T[]
for (key, value) in dict
if T <: Metric
Expand Down
7 changes: 6 additions & 1 deletion test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
if ~haskey(ENV, "MLFLOW_TRACKING_URI")
error("WARNING: MLFLOW_TRACKING_URI is not set. To run this tests, you need to set the URI of your MLFlow server API")
error(
"WARNING: MLFLOW_TRACKING_URI is not set. To run tests, "*
"you need to set this to the URI of your MLFlow server API. "*
"Setting this in Julia will look something like\n"*
"`ENV[\"MLFLOW_TRACKING_URI\"] = \"http://127.0.0.1:5000/api\"` "
)
end

include("base.jl")
Expand Down
Loading