def login(key, host, cloud, relogin, anonymously, no_offline=False): # TODO: handle no_offline anon_mode = "must" if anonymously else "never" if host and not host.startswith("http"): raise ClickException("host must start with http(s)://") _api = InternalApi() if host == "https://api.wandb.ai" or (host is None and cloud): _api.clear_setting("base_url", globally=True, persist=True) # To avoid writing an empty local settings file, we only clear if it exists if os.path.exists(Settings._local_path()): _api.clear_setting("base_url", persist=True) elif host: # force relogin if host is specified _api.set_setting("base_url", host.strip("/"), globally=True, persist=True) key = key[0] if len(key) > 0 else None if host or cloud or key: relogin = True wandb.setup( settings=wandb.Settings( _cli_only_mode=True, _disable_viewer=relogin, anonymous=anon_mode, base_url=host, ) ) wandb.login(relogin=relogin, key=key, anonymous=anon_mode, host=host, force=True)
def on(): api = InternalApi() try: api.clear_setting("disabled", persist=True) except configparser.Error: pass click.echo( "W&B enabled, running your script from this directory will now sync to the cloud." )
def on(): wandb.ensure_configured() api = InternalApi() try: api.clear_setting('disabled') except configparser.Error: pass click.echo( "W&B enabled, running your script from this directory will now sync to the cloud.")
def init(ctx, project, entity, reset): from wandb.old.core import _set_stage_dir, __stage_dir__, wandb_dir if __stage_dir__ is None: _set_stage_dir("wandb") # non interactive init if reset or project or entity: api = InternalApi() if reset: api.clear_setting("entity", persist=True) api.clear_setting("project", persist=True) # TODO(jhr): clear more settings? if entity: api.set_setting("entity", entity, persist=True) if project: api.set_setting("project", project, persist=True) return if os.path.isdir(wandb_dir()) and os.path.exists( os.path.join(wandb_dir(), "settings") ): click.confirm( click.style( "This directory has been configured previously, should we re-configure it?", bold=True, ), abort=True, ) else: click.echo( click.style("Let's setup this directory for W&B!", fg="green", bold=True) ) api = InternalApi() if api.api_key is None: ctx.invoke(login) viewer = api.viewer() # Viewer can be `None` in case your API information became invalid, or # in testing if you switch hosts. if not viewer: click.echo( click.style( "Your login information seems to be invalid: can you log in again please?", fg="red", bold=True, ) ) ctx.invoke(login) # This shouldn't happen. viewer = api.viewer() if not viewer: click.echo( click.style( "We're sorry, there was a problem logging you in. Please send us a note at [email protected] and tell us how this happened.", fg="red", bold=True, ) ) sys.exit(1) # At this point we should be logged in successfully. if len(viewer["teams"]["edges"]) > 1: team_names = [e["node"]["name"] for e in viewer["teams"]["edges"]] question = { "type": "list", "name": "team_name", "message": "Which team should we use?", "choices": team_names # TODO(jhr): disabling manual entry for cling # 'choices': team_names + ["Manual Entry"] } result = whaaaaat.prompt([question]) # result can be empty on click if result: entity = result["team_name"] else: entity = "Manual Entry" if entity == "Manual Entry": entity = click.prompt("Enter the name of the team you want to use") else: entity = viewer.get("entity") or click.prompt( "What username or team should we use?" ) # TODO: this error handling sucks and the output isn't pretty try: project = prompt_for_project(ctx, entity) except ClickWandbException: raise ClickException("Could not find team: %s" % entity) api.set_setting("entity", entity, persist=True) api.set_setting("project", project, persist=True) api.set_setting("base_url", api.settings().get("base_url"), persist=True) util.mkdir_exists_ok(wandb_dir()) with open(os.path.join(wandb_dir(), ".gitignore"), "w") as file: file.write("*\n!settings") click.echo( click.style("This directory is configured! Next, track a run:\n", fg="green") + textwrap.dedent( """\ * In your training script: {code1} {code2} * then `{run}`. """ ).format( code1=click.style("import wandb", bold=True), code2=click.style('wandb.init(project="%s")' % project, bold=True), run=click.style("python <train.py>", bold=True), ) )