wandb:获取所有工件集合的列表以及这些工件的所有别名
wandb: get a list of all artifact collections and all aliases of those artifacts
wandb 文档似乎没有解释如何执行此操作 - 但我认为这应该是一个相当常见的用例?
这样我基本上(但不完全)达到了我想要的效果,但看起来有点笨拙?我希望在 ArtifactCollection
个实例上有一个 self.aliases
属性?
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”等等)——不知道这个would/should 被显示,但我希望也能够获得旧别名(即指向旧版本工件的别名)。虽然,这不是那么重要。
编辑 - 经过几个小时查看他们的 sdk 代码后,我得到了这个(仍然对它的笨拙程度不满意):
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_artifacts = [
a
for a in api.artifact_type(
type_name="models", project="train"
).collections()
]
def get_alias_tuple(artifact_version):
version = None
aliases = []
for a in artifact_version._attrs["aliases"]:
if re.match(r"^v\d+$", a["alias"]):
version = a["alias"]
else:
aliases.append(a["alias"])
return version, aliases
for model in model_artifacts:
# artifact = api.artifact("train/" + model.name + ":latest")
# model._attrs.update(artifact._attrs)
# model._attrs["metadata"] = json.loads(model._attrs["metadata"])
versions = model.versions()
version_dict = dict(get_alias_tuple(version) for version in versions)
model.version_dict = version_dict
model.aliases = [
x for key, val in model.version_dict.items() for x in [key] + val
]
return model_artifacts
我是安尼鲁德。我是 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)
目前,关于集合的文档很少,但我们正在 public API 中完善它们,并将很快发布一些相关文档。这些 API 还没有完全准备好发布 -- 对于粗糙的边缘,我们深表歉意。
以后如果您对神器有任何其他疑问,请随时直接与我联系。乐于助人。
wandb 文档似乎没有解释如何执行此操作 - 但我认为这应该是一个相当常见的用例?
这样我基本上(但不完全)达到了我想要的效果,但看起来有点笨拙?我希望在 ArtifactCollection
个实例上有一个 self.aliases
属性?
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”等等)——不知道这个would/should 被显示,但我希望也能够获得旧别名(即指向旧版本工件的别名)。虽然,这不是那么重要。
编辑 - 经过几个小时查看他们的 sdk 代码后,我得到了这个(仍然对它的笨拙程度不满意):
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_artifacts = [
a
for a in api.artifact_type(
type_name="models", project="train"
).collections()
]
def get_alias_tuple(artifact_version):
version = None
aliases = []
for a in artifact_version._attrs["aliases"]:
if re.match(r"^v\d+$", a["alias"]):
version = a["alias"]
else:
aliases.append(a["alias"])
return version, aliases
for model in model_artifacts:
# artifact = api.artifact("train/" + model.name + ":latest")
# model._attrs.update(artifact._attrs)
# model._attrs["metadata"] = json.loads(model._attrs["metadata"])
versions = model.versions()
version_dict = dict(get_alias_tuple(version) for version in versions)
model.version_dict = version_dict
model.aliases = [
x for key, val in model.version_dict.items() for x in [key] + val
]
return model_artifacts
我是安尼鲁德。我是 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)
目前,关于集合的文档很少,但我们正在 public API 中完善它们,并将很快发布一些相关文档。这些 API 还没有完全准备好发布 -- 对于粗糙的边缘,我们深表歉意。
以后如果您对神器有任何其他疑问,请随时直接与我联系。乐于助人。