Files
2026-07-13 13:22:34 +08:00

147 lines
5.5 KiB
Python

import json
import os
import tempfile
import time
from datetime import datetime, timezone
from mlflow.entities.param import Param
from mlflow.entities.run_status import RunStatus
from mlflow.entities.run_tag import RunTag
from mlflow.utils.file_utils import make_containing_dirs, write_to
from mlflow.utils.mlflow_tags import MLFLOW_LOGGED_ARTIFACTS, MLFLOW_RUN_SOURCE_TYPE
from mlflow.version import VERSION as __version__
def create_eval_results_json(prompt_parameters, model_input, model_output_parameters, model_output):
columns = [param.key for param in prompt_parameters] + ["prompt", "output"]
data = [param.value for param in prompt_parameters] + [model_input, model_output]
updated_columns = columns + [param.key for param in model_output_parameters]
updated_data = data + [param.value for param in model_output_parameters]
eval_results = {"columns": updated_columns, "data": [updated_data]}
return json.dumps(eval_results)
def _create_promptlab_run_impl(
store,
experiment_id: str,
run_name: str,
tags: list[RunTag],
prompt_template: str,
prompt_parameters: list[Param],
model_route: str,
model_parameters: list[Param],
model_input: str,
model_output_parameters: list[Param],
model_output: str,
mlflow_version: str,
user_id: str,
start_time: str,
):
run = store.create_run(experiment_id, user_id, start_time, tags, run_name)
run_id = run.info.run_id
try:
prompt_parameters = [
Param(key=param.key, value=str(param.value)) for param in prompt_parameters
]
model_parameters = [
Param(key=param.key, value=str(param.value)) for param in model_parameters
]
model_output_parameters = [
Param(key=param.key, value=str(param.value)) for param in model_output_parameters
]
# log model parameters
parameters_to_log = [
*model_parameters,
Param("model_route", model_route),
Param("prompt_template", prompt_template),
]
tags_to_log = [
RunTag(
MLFLOW_LOGGED_ARTIFACTS,
json.dumps([{"path": "eval_results_table.json", "type": "table"}]),
),
RunTag(MLFLOW_RUN_SOURCE_TYPE, "PROMPT_ENGINEERING"),
]
store.log_batch(run_id, [], parameters_to_log, tags_to_log)
# log model
from mlflow.models import Model
artifact_dir = store.get_run(run_id).info.artifact_uri
utc_time_created = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")
promptlab_model = Model(
artifact_path="model",
run_id=run_id,
utc_time_created=utc_time_created,
)
store.record_logged_model(run_id, promptlab_model)
try:
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import ColSpec, DataType, Schema
except ImportError:
signature = None
else:
inputs_colspecs = [ColSpec(DataType.string, param.key) for param in prompt_parameters]
outputs_colspecs = [ColSpec(DataType.string, "output")]
signature = ModelSignature(
inputs=Schema(inputs_colspecs),
outputs=Schema(outputs_colspecs),
)
from mlflow.prompt.promptlab_model import save_model
from mlflow.server.handlers import (
_get_artifact_repo_mlflow_artifacts,
_get_proxied_run_artifact_destination_path,
_is_servable_proxied_run_artifact_root,
)
# write artifact files
from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
with tempfile.TemporaryDirectory() as local_dir:
save_model(
mlflow_model=promptlab_model,
path=os.path.join(local_dir, "model"),
signature=signature,
input_example={"inputs": [param.value for param in prompt_parameters]},
prompt_template=prompt_template,
prompt_parameters=prompt_parameters,
model_parameters=model_parameters,
model_route=model_route,
pip_requirements=[f"mlflow[gateway]=={__version__}"],
)
eval_results_json = create_eval_results_json(
prompt_parameters, model_input, model_output_parameters, model_output
)
eval_results_json_file_path = os.path.join(local_dir, "eval_results_table.json")
make_containing_dirs(eval_results_json_file_path)
write_to(eval_results_json_file_path, eval_results_json)
if _is_servable_proxied_run_artifact_root(run.info.artifact_uri):
artifact_repo = _get_artifact_repo_mlflow_artifacts()
artifact_path = _get_proxied_run_artifact_destination_path(
proxied_artifact_root=run.info.artifact_uri,
)
artifact_repo.log_artifacts(local_dir, artifact_path=artifact_path)
else:
artifact_repo = get_artifact_repository(artifact_dir)
artifact_repo.log_artifacts(local_dir)
except Exception:
store.update_run_info(run_id, RunStatus.FAILED, int(time.time() * 1000), run_name)
else:
# end time is the current number of milliseconds since the UNIX epoch.
store.update_run_info(run_id, RunStatus.FINISHED, int(time.time() * 1000), run_name)
return store.get_run(run_id=run_id)