wandb: получить список всех коллекций артефактов и всех псевдонимов этих артефактов

Документация wandb, похоже, не объясняет, как это сделать, но я могу представить, что это должен быть довольно распространенный вариант использования?

Я добился в основном (но не полностью) того, чего хотел, вот так, но это кажется немного неуклюжим? Я ожидал получить собственность на экземпляры?

      ENTITY = os.environ.get("WANDB_ENTITY")
API_KEY = os.environ.get("WANDB_API_KEY")

def get_model_artifacts(key=None):
    wandb.login(key=key if key is not None else API_KEY)
    api = wandb.Api(overrides={"entity": ENTITY})
    model_names = [
        i
        for i in api.artifact_type(
            type_name="models", project="train"
        ).collections()
    ]
    for model in model_names:
        artifact = api.artifact("train/" + model.name + ":latest")
        model._attrs.update(artifact._attrs)
        model._attrs["metadata"] = json.loads(model._attrs["metadata"])
        model.aliases = [x["alias"] for x in model._attrs["aliases"]]
    return model_names

Думаю, я мог бы при необходимости написать собственный запрос graph-ql или просто использовать этот неуклюжий метод.

Я что-то упускаю? Есть ли более чистый способ сделать это?

Единственное, чего не хватает в этом неуклюжем методе, - это старые псевдонимы - он показывает только последнюю модель, а затем любые ее псевдонимы (скажем, «последняя», а также «v4» и т. Д.) - не уверен, как это будет / должно отображаться, но Я бы надеялся получить и старые псевдонимы (т.е. псевдонимы, указывающие на старые версии артефакта). Хотя это менее важно.

1 ответ

Я Аннируд. Я инженер в W&B, помогавший создавать артефакты. Ваше решение действительно близко, но с помощью latestпсевдоним при получении артефакта мы будем рассматривать только псевдонимы из этого артефакта, а не всех его версий. Вы можете обойти это, перебирая версии:

      api = wandb.Api()
collections = [
    coll for coll in api.artifact_type(type_name=TYPE, project=PROJECT).collections()
]


aliases = set()
for coll in collections:
    for artifact in coll.versions():
        aliases.update(artifact.aliases)

print(collections)
print(aliases)

В настоящее время в документации мало коллекций, но мы дорабатываем их в общедоступном API и вскоре выпустим некоторые документы по этому поводу. Эти API еще не совсем готовы к выпуску - так что извиняемся за неровности.

Не стесняйтесь обращаться ко мне напрямую в будущем, если у вас возникнут другие вопросы относительно артефактов. Всегда рады помочь.

Другие вопросы по тегам