Source code for optuna.artifacts._list_artifact_meta
from __future__ import annotations
import json
from optuna.artifacts._upload import ArtifactMeta
from optuna.artifacts._upload import ARTIFACTS_ATTR_PREFIX
from optuna.storages import BaseStorage
from optuna.study import Study
from optuna.trial import FrozenTrial
from optuna.trial import Trial
[docs]
def get_all_artifact_meta(
study_or_trial: Trial | FrozenTrial | Study, *, storage: BaseStorage | None = None
) -> list[ArtifactMeta]:
"""List the associated artifact information of the provided trial or study.
Args:
study_or_trial:
A :class:`~optuna.trial.Trial` object, a :class:`~optuna.trial.FrozenTrial`, or
a :class:`~optuna.study.Study` object.
storage:
A storage object. This argument is required only if ``study_or_trial`` is
:class:`~optuna.trial.FrozenTrial`.
Example:
An example where this function is useful:
.. code::
import os
import optuna
# Get the storage that contains the study of interest.
storage = optuna.storages.get_storage(storage=...)
# Instantiate the artifact store used for the study.
# Optuna does not provide the API that stores the used artifact store information, so
# please manage the information in the user side.
artifact_store = ...
# Load study that contains the artifacts of interest.
study = optuna.load_study(study_name=..., storage=storage)
# Fetch the best trial.
best_trial = study.best_trial
# Fetch all the artifact meta connected to the best trial.
artifact_metas = optuna.artifacts.get_all_artifact_meta(best_trial, storage=storage)
download_dir_path = "./best_trial_artifacts/"
os.makedirs(download_dir_path, exist_ok=True)
for artifact_meta in artifact_metas:
download_file_path = os.path.join(download_dir_path, artifact_meta.filename)
# Download the artifacts to ``download_file_path``.
optuna.artifacts.download_artifact(
artifact_store=artifact_store,
artifact_id=artifact_meta.artifact_id,
file_path=download_file_path,
)
Returns:
The list of artifact meta in the trial or study.
Each artifact meta includes ``artifact_id``, ``filename``, ``mimetype``, and ``encoding``.
Note that if :class:`~optuna.study.Study` is provided, we return the information of the
artifacts uploaded to ``study``, but not to all the trials in the study.
"""
if isinstance(study_or_trial, Trial) and storage is None:
storage = study_or_trial.storage
elif isinstance(study_or_trial, Study) and storage is None:
storage = study_or_trial._storage
if storage is None:
raise ValueError("storage is required for FrozenTrial.")
if isinstance(study_or_trial, (Trial, FrozenTrial)):
system_attrs = storage.get_trial_system_attrs(study_or_trial._trial_id)
else:
system_attrs = storage.get_study_system_attrs(study_or_trial._study_id)
artifact_meta_list: list[ArtifactMeta] = []
for attr_key, attr_json_string in system_attrs.items():
if not attr_key.startswith(ARTIFACTS_ATTR_PREFIX):
continue
attr_content = json.loads(attr_json_string)
artifact_meta = ArtifactMeta(
artifact_id=attr_content["artifact_id"],
filename=attr_content["filename"],
mimetype=attr_content["mimetype"],
encoding=attr_content["encoding"],
)
artifact_meta_list.append(artifact_meta)
return artifact_meta_list