如何获取W&B所有artifact collections及其artifact的所有别名
方案1:v0.13.10及以上版本最简实现(仅获取集合维度别名)
该版本SDK已原生支持ArtifactCollection实例的aliases属性,无需手动拼接属性,代码可以简化为:
import os import 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 else API_KEY) api = wandb.Api(overrides={"entity": ENTITY}) # 直接获取所有模型集合,原生自带aliases属性 return list(api.artifact_type(type_name="models", project="train").collections())
调用返回的每个model对象直接调用model.aliases即可拿到对应别名。
方案2:兼容低版本+获取全版本所有别名(含历史版本)
如果需要获取集合下所有版本的别名(包括指向旧版本的别名),可以优化现有实现,避免直接访问私有属性_attrs,降低后续版本升级兼容性风险:
import os import re import 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 else API_KEY) api = wandb.Api(overrides={"entity": ENTITY}) model_collections = list(api.artifact_type(type_name="models", project="train").collections()) for model in model_collections: version_map = {} all_aliases = set() # 遍历所有版本,用公开的aliases属性即可 for version in model.versions(): ver_num = None ver_aliases = [] for alias in version.aliases: if re.fullmatch(r"v\d+", alias): ver_num = alias else: ver_aliases.append(alias) all_aliases.add(alias) if ver_num: version_map[ver_num] = ver_aliases all_aliases.add(ver_num) # 挂载属性到集合对象 model.version_map = version_map model.all_aliases = list(all_aliases) return model_collections
这个实现的优势:
- 不访问私有属性,兼容性更强
- 自动去重重复别名
- 同时保留版本和别名的映射关系,方便后续查询某个别名指向的具体版本
内容的提问来源于stack exchange,提问作者Alex L
相关产品推荐
相关产品推荐

