wandb 0.16.5__py3-none-any.whl → 0.16.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wandb/__init__.py +1 -1
- wandb/cli/cli.py +5 -2
- wandb/integration/openai/fine_tuning.py +74 -37
- wandb/proto/v3/wandb_internal_pb2.py +192 -192
- wandb/proto/v3/wandb_settings_pb2.py +2 -2
- wandb/proto/v4/wandb_internal_pb2.py +192 -192
- wandb/proto/v4/wandb_settings_pb2.py +2 -2
- wandb/sdk/artifacts/artifact.py +25 -9
- wandb/sdk/artifacts/artifact_saver.py +16 -19
- wandb/sdk/interface/interface.py +18 -6
- wandb/sdk/launch/_launch.py +5 -0
- wandb/sdk/launch/_project_spec.py +5 -20
- wandb/sdk/launch/agent/agent.py +80 -37
- wandb/sdk/launch/agent/config.py +8 -0
- wandb/sdk/launch/builder/kaniko_builder.py +149 -134
- wandb/sdk/launch/create_job.py +43 -48
- wandb/sdk/launch/runner/kubernetes_monitor.py +3 -1
- wandb/sdk/launch/sweeps/scheduler.py +3 -1
- wandb/sdk/launch/utils.py +18 -0
- wandb/sdk/lib/_settings_toposort_generated.py +1 -0
- wandb/sdk/lib/run_moment.py +7 -1
- wandb/sdk/wandb_init.py +2 -8
- wandb/sdk/wandb_run.py +50 -34
- wandb/sdk/wandb_settings.py +2 -0
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/METADATA +1 -1
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/RECORD +30 -30
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/LICENSE +0 -0
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/WHEEL +0 -0
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/entry_points.txt +0 -0
- {wandb-0.16.5.dist-info → wandb-0.16.6.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
|
|
14
14
|
from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
|
15
15
|
|
16
16
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n wandb/proto/wandb_settings.proto\x12\x0ewandb_internal\x1a\x1egoogle/protobuf/wrappers.proto\" \n\x0fListStringValue\x12\r\n\x05value\x18\x01 \x03(\t\"\x8a\x01\n\x17MapStringKeyStringValue\x12\x41\n\x05value\x18\x01 \x03(\x0b\x32\x32.wandb_internal.MapStringKeyStringValue.ValueEntry\x1a,\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xcb\x01\n#MapStringKeyMapStringKeyStringValue\x12M\n\x05value\x18\x01 \x03(\x0b\x32>.wandb_internal.MapStringKeyMapStringKeyStringValue.ValueEntry\x1aU\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue:\x02\x38\x01\"\x9a\x01\n\x12OpenMetricsFilters\x12\x33\n\x08sequence\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValueH\x00\x12\x46\n\x07mapping\x18\x02 \x01(\x0b\x32\x33.wandb_internal.MapStringKeyMapStringKeyStringValueH\x00\x42\x07\n\x05value\"7\n\tRunMoment\x12\x0b\n\x03run\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\x12\x0e\n\x06metric\x18\x03 \x01(\t\"\xc9\x44\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06run_id\x18k \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07run_url\x18q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07project\x18\x61 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x65ntity\x18\x45 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07log_dir\x18U \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0clog_internal\x18V \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tfiles_dir\x18\x46 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x44\n\x1f_async_upload_concurrency_limit\x18\x03 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x32\n\x0e_cli_only_mode\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06_colab\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x05_cuda\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10_disable_service\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15_disable_setproctitle\x18\t \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0f_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\x0c_except_exit\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\x0b_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x44\n\x13_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12\x42\n\x1c_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x14_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x16_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x17_internal_check_process\x18\x12 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12=\n\x17_internal_queue_timeout\x18\x13 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08_ipython\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_jupyter\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\r_jupyter_root\x18\x16 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07_kaggle\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x16_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\n_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0f_network_buffer\x18\x1b \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12)\n\x05_noop\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\t_notebook\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x05_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x11_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_require_core\x18$ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x12_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\r_service_wait\x18\' \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x35\n\x0f_start_datetime\x18( \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0b_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12/\n\n_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12@\n\x1a_stats_sample_rate_seconds\x18+ \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x19_stats_samples_to_average\x18, \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x12_stats_join_assets\x18- \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12G\n!_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12N\n\x1d_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12G\n\x1b_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_tracelog\x18\x32 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\r_unsaved_keys\x18\x33 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12,\n\x08_windows\x18\x34 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10\x61llow_val_change\x18\x35 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\tanonymous\x18\x36 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12P\n\x1f\x61zure_account_url_to_access_key\x18\x38 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08\x63ode_dir\x18: \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0c\x63onfig_paths\x18; \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ndeployment\x18= \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\x0c\x64isable_code\x18> \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05\x66orce\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\ngit_commit\x18H \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ngit_remote\x18I \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0egit_remote_url\x18J \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08git_root\x18K \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11heartbeat_seconds\x18L \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x32\n\x0cinit_timeout\x18O \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08is_local\x18P \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\njob_source\x18Q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\rlabel_disable\x18R \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06launch\x18S \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12launch_config_path\x18T \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x14log_symlink_internal\x18W \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x10log_symlink_user\x18X \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08log_user\x18Y \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rlogin_timeout\x18Z \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12*\n\x04mode\x18\\ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rnotebook_name\x18] \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07problem\x18^ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07program\x18_ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fprogram_relpath\x18` \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bproject_url\x18\x62 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05quiet\x18\x63 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06reinit\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cresume_fname\x18g \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07resumed\x18h \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_group\x18j \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0crun_job_type\x18l \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_mode\x18m \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_name\x18n \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_notes\x18o \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x08run_tags\x18p \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x35\n\x11sagemaker_disable\x18r \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x0fsettings_system\x18t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12settings_workspace\x18u \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bshow_colors\x18v \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nshow_emoji\x18w \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0bshow_errors\x18x \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tshow_info\x18y \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rshow_warnings\x18z \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06silent\x18{ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0cstart_method\x18| \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x06strict\x18} \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0esummary_errors\x18~ \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0fsummary_timeout\x18\x7f \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x10summary_warnings\x18\x80\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\x08sweep_id\x18\x81\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10sweep_param_path\x18\x82\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x07symlink\x18\x84\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08sync_dir\x18\x85\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x13sync_symlink_latest\x18\x87\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rsystem_sample\x18\x88\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x15system_sample_seconds\x18\x89\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n%table_raise_on_max_row_limit_exceeded\x18\x8a\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08timespec\x18\x8b\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x07tmp_dir\x18\x8c\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_path\x18\x90\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08job_name\x18\x91\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x11_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12<\n\x16_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n#_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12J\n#_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x18_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12L\n%_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12L\n%_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x1e_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x12_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1f_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1f_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12?\n\x18_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12:\n\x15_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12,\n\x07_shared\x18\xa2\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x08_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValueb\x06proto3')
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n wandb/proto/wandb_settings.proto\x12\x0ewandb_internal\x1a\x1egoogle/protobuf/wrappers.proto\" \n\x0fListStringValue\x12\r\n\x05value\x18\x01 \x03(\t\"\x8a\x01\n\x17MapStringKeyStringValue\x12\x41\n\x05value\x18\x01 \x03(\x0b\x32\x32.wandb_internal.MapStringKeyStringValue.ValueEntry\x1a,\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xcb\x01\n#MapStringKeyMapStringKeyStringValue\x12M\n\x05value\x18\x01 \x03(\x0b\x32>.wandb_internal.MapStringKeyMapStringKeyStringValue.ValueEntry\x1aU\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue:\x02\x38\x01\"\x9a\x01\n\x12OpenMetricsFilters\x12\x33\n\x08sequence\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValueH\x00\x12\x46\n\x07mapping\x18\x02 \x01(\x0b\x32\x33.wandb_internal.MapStringKeyMapStringKeyStringValueH\x00\x42\x07\n\x05value\"7\n\tRunMoment\x12\x0b\n\x03run\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\x12\x0e\n\x06metric\x18\x03 \x01(\t\"\x85\x45\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06run_id\x18k \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07run_url\x18q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07project\x18\x61 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x65ntity\x18\x45 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07log_dir\x18U \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0clog_internal\x18V \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tfiles_dir\x18\x46 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12:\n\x15_disable_update_check\x18\xa5\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x44\n\x1f_async_upload_concurrency_limit\x18\x03 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x32\n\x0e_cli_only_mode\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06_colab\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x05_cuda\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10_disable_service\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15_disable_setproctitle\x18\t \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0f_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\x0c_except_exit\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\x0b_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x44\n\x13_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12\x42\n\x1c_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x14_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x16_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x17_internal_check_process\x18\x12 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12=\n\x17_internal_queue_timeout\x18\x13 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08_ipython\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_jupyter\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\r_jupyter_root\x18\x16 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07_kaggle\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x16_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\n_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0f_network_buffer\x18\x1b \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12)\n\x05_noop\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\t_notebook\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x05_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x11_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_require_core\x18$ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x12_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\r_service_wait\x18\' \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x35\n\x0f_start_datetime\x18( \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0b_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12/\n\n_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12@\n\x1a_stats_sample_rate_seconds\x18+ \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x19_stats_samples_to_average\x18, \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x12_stats_join_assets\x18- \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12G\n!_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12N\n\x1d_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12G\n\x1b_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_tracelog\x18\x32 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\r_unsaved_keys\x18\x33 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12,\n\x08_windows\x18\x34 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10\x61llow_val_change\x18\x35 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\tanonymous\x18\x36 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12P\n\x1f\x61zure_account_url_to_access_key\x18\x38 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08\x63ode_dir\x18: \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0c\x63onfig_paths\x18; \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ndeployment\x18= \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\x0c\x64isable_code\x18> \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05\x66orce\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\ngit_commit\x18H \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ngit_remote\x18I \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0egit_remote_url\x18J \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08git_root\x18K \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11heartbeat_seconds\x18L \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cinit_timeout\x18O \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08is_local\x18P \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\njob_source\x18Q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\rlabel_disable\x18R \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06launch\x18S \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12launch_config_path\x18T \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x14log_symlink_internal\x18W \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x10log_symlink_user\x18X \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08log_user\x18Y \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rlogin_timeout\x18Z \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12*\n\x04mode\x18\\ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rnotebook_name\x18] \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07problem\x18^ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07program\x18_ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fprogram_relpath\x18` \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bproject_url\x18\x62 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05quiet\x18\x63 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06reinit\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cresume_fname\x18g \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07resumed\x18h \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_group\x18j \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0crun_job_type\x18l \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_mode\x18m \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_name\x18n \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_notes\x18o \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x08run_tags\x18p \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x35\n\x11sagemaker_disable\x18r \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x0fsettings_system\x18t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12settings_workspace\x18u \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bshow_colors\x18v \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nshow_emoji\x18w \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0bshow_errors\x18x \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tshow_info\x18y \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rshow_warnings\x18z \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06silent\x18{ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0cstart_method\x18| \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x06strict\x18} \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0esummary_errors\x18~ \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0fsummary_timeout\x18\x7f \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x10summary_warnings\x18\x80\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\x08sweep_id\x18\x81\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10sweep_param_path\x18\x82\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x07symlink\x18\x84\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08sync_dir\x18\x85\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x13sync_symlink_latest\x18\x87\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rsystem_sample\x18\x88\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x15system_sample_seconds\x18\x89\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n%table_raise_on_max_row_limit_exceeded\x18\x8a\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08timespec\x18\x8b\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x07tmp_dir\x18\x8c\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_path\x18\x90\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08job_name\x18\x91\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x11_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12<\n\x16_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n#_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12J\n#_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x18_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12L\n%_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12L\n%_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x1e_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x12_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1f_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1f_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12?\n\x18_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12:\n\x15_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12,\n\x07_shared\x18\xa2\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x08_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValueb\x06proto3')
|
18
18
|
|
19
19
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
20
20
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'wandb.proto.wandb_settings_pb2', globals())
|
@@ -40,5 +40,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
40
40
|
_RUNMOMENT._serialized_start=622
|
41
41
|
_RUNMOMENT._serialized_end=677
|
42
42
|
_SETTINGS._serialized_start=680
|
43
|
-
_SETTINGS._serialized_end=
|
43
|
+
_SETTINGS._serialized_end=9517
|
44
44
|
# @@protoc_insertion_point(module_scope)
|
wandb/sdk/artifacts/artifact.py
CHANGED
@@ -225,10 +225,14 @@ class Artifact:
|
|
225
225
|
attrs = response.get("artifact")
|
226
226
|
if attrs is None:
|
227
227
|
return None
|
228
|
-
|
229
|
-
|
228
|
+
attr_project = attrs["artifactSequence"]["project"]
|
229
|
+
entity_name = ""
|
230
|
+
project_name = ""
|
231
|
+
if attr_project:
|
232
|
+
entity_name = attr_project["entityName"]
|
233
|
+
project_name = attr_project["name"]
|
230
234
|
name = "{}:v{}".format(attrs["artifactSequence"]["name"], attrs["versionIndex"])
|
231
|
-
return cls._from_attrs(
|
235
|
+
return cls._from_attrs(entity_name, project_name, name, attrs, client)
|
232
236
|
|
233
237
|
@classmethod
|
234
238
|
def _from_name(
|
@@ -284,7 +288,9 @@ class Artifact:
|
|
284
288
|
aliases = [
|
285
289
|
alias["alias"]
|
286
290
|
for alias in attrs["aliases"]
|
287
|
-
if alias["artifactCollection"]
|
291
|
+
if alias["artifactCollection"]
|
292
|
+
and alias["artifactCollection"]["project"]
|
293
|
+
and alias["artifactCollection"]["project"]["entityName"] == entity
|
288
294
|
and alias["artifactCollection"]["project"]["name"] == project
|
289
295
|
and alias["artifactCollection"]["name"] == name.split(":")[0]
|
290
296
|
]
|
@@ -293,8 +299,12 @@ class Artifact:
|
|
293
299
|
]
|
294
300
|
assert len(version_aliases) == 1
|
295
301
|
artifact._version = version_aliases[0]
|
296
|
-
|
297
|
-
artifact.
|
302
|
+
attr_project = attrs["artifactSequence"]["project"]
|
303
|
+
artifact._source_entity = ""
|
304
|
+
artifact._source_project = ""
|
305
|
+
if attr_project:
|
306
|
+
artifact._source_entity = attr_project["entityName"]
|
307
|
+
artifact._source_project = attr_project["name"]
|
298
308
|
artifact._source_name = "{}:v{}".format(
|
299
309
|
attrs["artifactSequence"]["name"], attrs["versionIndex"]
|
300
310
|
)
|
@@ -861,8 +871,12 @@ class Artifact:
|
|
861
871
|
if attrs is None:
|
862
872
|
raise ValueError(f"Unable to fetch artifact with id {artifact_id}")
|
863
873
|
self._id = artifact_id
|
864
|
-
|
865
|
-
self.
|
874
|
+
attr_project = attrs["artifactSequence"]["project"]
|
875
|
+
self._entity = ""
|
876
|
+
self._project = ""
|
877
|
+
if attr_project:
|
878
|
+
self._entity = attr_project["entityName"]
|
879
|
+
self._project = attr_project["name"]
|
866
880
|
self._name = "{}:v{}".format(
|
867
881
|
attrs["artifactSequence"]["name"], attrs["versionIndex"]
|
868
882
|
)
|
@@ -881,7 +895,9 @@ class Artifact:
|
|
881
895
|
self._aliases = [
|
882
896
|
alias["alias"]
|
883
897
|
for alias in attrs["aliases"]
|
884
|
-
if alias["artifactCollection"]
|
898
|
+
if alias["artifactCollection"]
|
899
|
+
and alias["artifactCollection"]["project"]
|
900
|
+
and alias["artifactCollection"]["project"]["entityName"] == self._entity
|
885
901
|
and alias["artifactCollection"]["project"]["name"] == self._project
|
886
902
|
and alias["artifactCollection"]["name"] == self._name.split(":")[0]
|
887
903
|
and not util.alias_is_version_index(alias["alias"])
|
@@ -75,25 +75,22 @@ class ArtifactSaver:
|
|
75
75
|
history_step: Optional[int] = None,
|
76
76
|
base_id: Optional[str] = None,
|
77
77
|
) -> Optional[Dict]:
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
)
|
95
|
-
finally:
|
96
|
-
pass
|
78
|
+
return self._save_internal(
|
79
|
+
type,
|
80
|
+
name,
|
81
|
+
client_id,
|
82
|
+
sequence_client_id,
|
83
|
+
distributed_id,
|
84
|
+
finalize,
|
85
|
+
metadata,
|
86
|
+
ttl_duration_seconds,
|
87
|
+
description,
|
88
|
+
aliases,
|
89
|
+
use_after_commit,
|
90
|
+
incremental,
|
91
|
+
history_step,
|
92
|
+
base_id,
|
93
|
+
)
|
97
94
|
|
98
95
|
def _save_internal(
|
99
96
|
self,
|
wandb/sdk/interface/interface.py
CHANGED
@@ -25,6 +25,7 @@ from typing import (
|
|
25
25
|
Union,
|
26
26
|
)
|
27
27
|
|
28
|
+
from wandb import termwarn
|
28
29
|
from wandb.proto import wandb_internal_pb2 as pb
|
29
30
|
from wandb.proto import wandb_telemetry_pb2 as tpb
|
30
31
|
from wandb.sdk.artifacts.artifact import Artifact
|
@@ -447,16 +448,27 @@ class InterfaceBase:
|
|
447
448
|
path = artifact.get_entry("wandb-job.json").download()
|
448
449
|
with open(path) as f:
|
449
450
|
job_info = json.load(f)
|
451
|
+
|
450
452
|
except Exception as e:
|
451
453
|
logger.warning(
|
452
454
|
f"Failed to download partial job info from artifact {artifact}, : {e}"
|
453
455
|
)
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
456
|
+
termwarn(
|
457
|
+
f"Failed to download partial job info from artifact {artifact}, : {e}"
|
458
|
+
)
|
459
|
+
return
|
460
|
+
|
461
|
+
try:
|
462
|
+
use_artifact = self._make_proto_use_artifact(
|
463
|
+
use_artifact=use_artifact,
|
464
|
+
job_name=artifact.name,
|
465
|
+
job_info=job_info,
|
466
|
+
metadata=artifact.metadata,
|
467
|
+
)
|
468
|
+
except Exception as e:
|
469
|
+
logger.warning(f"Failed to construct use artifact proto: {e}")
|
470
|
+
termwarn(f"Failed to construct use artifact proto: {e}")
|
471
|
+
return
|
460
472
|
|
461
473
|
self._publish_use_artifact(use_artifact)
|
462
474
|
|
wandb/sdk/launch/_launch.py
CHANGED
@@ -62,6 +62,7 @@ def resolve_agent_config( # noqa: C901
|
|
62
62
|
max_jobs: Optional[int],
|
63
63
|
queues: Optional[Tuple[str]],
|
64
64
|
config: Optional[str],
|
65
|
+
verbosity: Optional[int],
|
65
66
|
) -> Tuple[Dict[str, Any], Api]:
|
66
67
|
"""Resolve the agent config.
|
67
68
|
|
@@ -72,6 +73,7 @@ def resolve_agent_config( # noqa: C901
|
|
72
73
|
max_jobs (int): The max number of jobs.
|
73
74
|
queues (Tuple[str]): The queues.
|
74
75
|
config (str): The config.
|
76
|
+
verbosity (int): How verbose to print, 0 or None = default, 1 = print status every 20 seconds, 2 = also print debugging information
|
75
77
|
|
76
78
|
Returns:
|
77
79
|
Tuple[Dict[str, Any], Api]: The resolved config and api.
|
@@ -83,6 +85,7 @@ def resolve_agent_config( # noqa: C901
|
|
83
85
|
"queues": [],
|
84
86
|
"registry": {},
|
85
87
|
"builder": {},
|
88
|
+
"verbosity": 0,
|
86
89
|
}
|
87
90
|
user_set_project = False
|
88
91
|
resolved_config: Dict[str, Any] = defaults
|
@@ -123,6 +126,8 @@ def resolve_agent_config( # noqa: C901
|
|
123
126
|
resolved_config.update({"max_jobs": int(max_jobs)})
|
124
127
|
if queues:
|
125
128
|
resolved_config.update({"queues": list(queues)})
|
129
|
+
if verbosity:
|
130
|
+
resolved_config.update({"verbosity": int(verbosity)})
|
126
131
|
# queue -> queues
|
127
132
|
if resolved_config.get("queue"):
|
128
133
|
if isinstance(resolved_config.get("queue"), str):
|
@@ -14,6 +14,7 @@ import wandb.docker as docker
|
|
14
14
|
from wandb.apis.internal import Api
|
15
15
|
from wandb.errors import CommError
|
16
16
|
from wandb.sdk.launch import utils
|
17
|
+
from wandb.sdk.launch.utils import get_entrypoint_file
|
17
18
|
from wandb.sdk.lib.runid import generate_id
|
18
19
|
|
19
20
|
from .errors import LaunchError
|
@@ -135,7 +136,7 @@ class LaunchProject:
|
|
135
136
|
if override_entrypoint:
|
136
137
|
_logger.info("Adding override entry point")
|
137
138
|
self.override_entrypoint = EntryPoint(
|
138
|
-
name=
|
139
|
+
name=get_entrypoint_file(override_entrypoint),
|
139
140
|
command=override_entrypoint,
|
140
141
|
)
|
141
142
|
|
@@ -536,24 +537,6 @@ class LaunchProject:
|
|
536
537
|
self.git_version = branch_name
|
537
538
|
|
538
539
|
|
539
|
-
def _get_entrypoint_file(entrypoint: List[str]) -> Optional[str]:
|
540
|
-
"""Get the entrypoint file from the given command.
|
541
|
-
|
542
|
-
Args:
|
543
|
-
entrypoint (List[str]): List of command and arguments.
|
544
|
-
|
545
|
-
Returns:
|
546
|
-
Optional[str]: The entrypoint file if found, otherwise None.
|
547
|
-
"""
|
548
|
-
if not entrypoint:
|
549
|
-
return None
|
550
|
-
if entrypoint[0].endswith(".py") or entrypoint[0].endswith(".sh"):
|
551
|
-
return entrypoint[0]
|
552
|
-
if len(entrypoint) < 2:
|
553
|
-
return None
|
554
|
-
return entrypoint[1]
|
555
|
-
|
556
|
-
|
557
540
|
class EntryPoint:
|
558
541
|
"""An entry point into a wandb launch specification."""
|
559
542
|
|
@@ -570,7 +553,9 @@ class EntryPoint:
|
|
570
553
|
|
571
554
|
def update_entrypoint_path(self, new_path: str) -> None:
|
572
555
|
"""Updates the entrypoint path to a new path."""
|
573
|
-
if len(self.command) == 2 and
|
556
|
+
if len(self.command) == 2 and (
|
557
|
+
self.command[0].startswith("python") or self.command[0] == "bash"
|
558
|
+
):
|
574
559
|
self.command[1] = new_path
|
575
560
|
|
576
561
|
|
wandb/sdk/launch/agent/agent.py
CHANGED
@@ -45,7 +45,10 @@ MAX_RESUME_COUNT = 5
|
|
45
45
|
|
46
46
|
RUN_INFO_GRACE_PERIOD = 60
|
47
47
|
|
48
|
-
|
48
|
+
DEFAULT_STOPPED_RUN_TIMEOUT = 60
|
49
|
+
|
50
|
+
DEFAULT_PRINT_INTERVAL = 5 * 60
|
51
|
+
VERBOSE_PRINT_INTERVAL = 20
|
49
52
|
|
50
53
|
_env_timeout = os.environ.get("WANDB_LAUNCH_START_TIMEOUT")
|
51
54
|
if _env_timeout:
|
@@ -105,30 +108,29 @@ def _max_from_config(
|
|
105
108
|
return max_from_config
|
106
109
|
|
107
110
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
_logger.debug("Recieved runSpec in _is_scheduler_job that was empty")
|
111
|
+
class InternalAgentLogger:
|
112
|
+
def __init__(self, verbosity=0):
|
113
|
+
self._print_to_terminal = verbosity >= 2
|
112
114
|
|
113
|
-
|
114
|
-
|
115
|
+
def error(self, message: str):
|
116
|
+
if self._print_to_terminal:
|
117
|
+
wandb.termerror(f"{LOG_PREFIX}{message}")
|
118
|
+
_logger.error(f"{LOG_PREFIX}{message}")
|
115
119
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
return True
|
120
|
+
def warn(self, message: str):
|
121
|
+
if self._print_to_terminal:
|
122
|
+
wandb.termwarn(f"{LOG_PREFIX}{message}")
|
123
|
+
_logger.warn(f"{LOG_PREFIX}{message}")
|
121
124
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
return False
|
125
|
+
def info(self, message: str):
|
126
|
+
if self._print_to_terminal:
|
127
|
+
wandb.termlog(f"{LOG_PREFIX}{message}")
|
128
|
+
_logger.info(f"{LOG_PREFIX}{message}")
|
127
129
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
130
|
+
def debug(self, message: str):
|
131
|
+
if self._print_to_terminal:
|
132
|
+
wandb.termlog(f"{LOG_PREFIX}{message}")
|
133
|
+
_logger.debug(f"{LOG_PREFIX}{message}")
|
132
134
|
|
133
135
|
|
134
136
|
class LaunchAgent:
|
@@ -184,7 +186,13 @@ class LaunchAgent:
|
|
184
186
|
self._max_jobs = _max_from_config(config, "max_jobs")
|
185
187
|
self._max_schedulers = _max_from_config(config, "max_schedulers")
|
186
188
|
self._secure_mode = config.get("secure_mode", False)
|
189
|
+
self._verbosity = config.get("verbosity", 0)
|
190
|
+
self._internal_logger = InternalAgentLogger(verbosity=self._verbosity)
|
191
|
+
self._last_status_print_time = 0.0
|
187
192
|
self.default_config: Dict[str, Any] = config
|
193
|
+
self._stopped_run_timeout = config.get(
|
194
|
+
"stopped_run_timeout", DEFAULT_STOPPED_RUN_TIMEOUT
|
195
|
+
)
|
188
196
|
|
189
197
|
# Get agent version from env var if present, otherwise wandb version
|
190
198
|
self.version: str = "wandb@" + wandb.__version__
|
@@ -228,6 +236,33 @@ class LaunchAgent:
|
|
228
236
|
self._name = agent_response["name"]
|
229
237
|
self._init_agent_run()
|
230
238
|
|
239
|
+
def _is_scheduler_job(self, run_spec: Dict[str, Any]) -> bool:
|
240
|
+
"""Determine whether a job/runSpec is a sweep scheduler."""
|
241
|
+
if not run_spec:
|
242
|
+
self._internal_logger.debug(
|
243
|
+
"Recieved runSpec in _is_scheduler_job that was empty"
|
244
|
+
)
|
245
|
+
|
246
|
+
if run_spec.get("uri") != Scheduler.PLACEHOLDER_URI:
|
247
|
+
return False
|
248
|
+
|
249
|
+
if run_spec.get("resource") == "local-process":
|
250
|
+
# Any job pushed to a run queue that has a scheduler uri is
|
251
|
+
# allowed to use local-process
|
252
|
+
if run_spec.get("job"):
|
253
|
+
return True
|
254
|
+
|
255
|
+
# If a scheduler is local-process and run through CLI, also
|
256
|
+
# confirm command is in format: [wandb scheduler <sweep>]
|
257
|
+
cmd = run_spec.get("overrides", {}).get("entry_point", [])
|
258
|
+
if len(cmd) < 3:
|
259
|
+
return False
|
260
|
+
|
261
|
+
if cmd[:2] != ["wandb", "scheduler"]:
|
262
|
+
return False
|
263
|
+
|
264
|
+
return True
|
265
|
+
|
231
266
|
async def fail_run_queue_item(
|
232
267
|
self,
|
233
268
|
run_queue_item_id: str,
|
@@ -298,6 +333,7 @@ class LaunchAgent:
|
|
298
333
|
|
299
334
|
def print_status(self) -> None:
|
300
335
|
"""Prints the current status of the agent."""
|
336
|
+
self._last_status_print_time = time.time()
|
301
337
|
output_str = "agent "
|
302
338
|
if self._name:
|
303
339
|
output_str += f"{self._name} "
|
@@ -344,8 +380,8 @@ class LaunchAgent:
|
|
344
380
|
if run_state.lower() != "pending":
|
345
381
|
return True
|
346
382
|
except CommError:
|
347
|
-
|
348
|
-
f"Run {entity}/{project}/{run_id} with rqi id: {rqi_id} did not have associated run"
|
383
|
+
self._internal_logger.info(
|
384
|
+
f"Run {entity}/{project}/{run_id} with rqi id: {rqi_id} did not have associated run",
|
349
385
|
)
|
350
386
|
return False
|
351
387
|
|
@@ -361,8 +397,8 @@ class LaunchAgent:
|
|
361
397
|
job_and_run_status.entity is not None
|
362
398
|
and job_and_run_status.entity != self._entity
|
363
399
|
):
|
364
|
-
|
365
|
-
"Skipping check for completed run status because run is on a different entity than agent"
|
400
|
+
self._internal_logger.info(
|
401
|
+
"Skipping check for completed run status because run is on a different entity than agent",
|
366
402
|
)
|
367
403
|
elif exception is not None:
|
368
404
|
tb_str = traceback.format_exception(
|
@@ -378,8 +414,8 @@ class LaunchAgent:
|
|
378
414
|
fnames,
|
379
415
|
)
|
380
416
|
elif job_and_run_status.project is None or job_and_run_status.run_id is None:
|
381
|
-
|
382
|
-
f"called finish_thread_id on thread whose tracker has no project or run id. RunQueueItemID: {job_and_run_status.run_queue_item_id}"
|
417
|
+
self._internal_logger.info(
|
418
|
+
f"called finish_thread_id on thread whose tracker has no project or run id. RunQueueItemID: {job_and_run_status.run_queue_item_id}",
|
383
419
|
)
|
384
420
|
wandb.termerror(
|
385
421
|
"Missing project or run id on thread called finish thread id"
|
@@ -430,7 +466,9 @@ class LaunchAgent:
|
|
430
466
|
job_and_run_status.run_queue_item_id, _msg, "run", fnames
|
431
467
|
)
|
432
468
|
else:
|
433
|
-
|
469
|
+
self._internal_logger.info(
|
470
|
+
f"Finish thread id {thread_id} had no exception and no run"
|
471
|
+
)
|
434
472
|
wandb._sentry.exception(
|
435
473
|
"launch agent called finish thread id on thread without run or exception"
|
436
474
|
)
|
@@ -458,7 +496,7 @@ class LaunchAgent:
|
|
458
496
|
await self.update_status(AGENT_RUNNING)
|
459
497
|
|
460
498
|
# parse job
|
461
|
-
|
499
|
+
self._internal_logger.info("Parsing launch spec")
|
462
500
|
launch_spec = job["runSpec"]
|
463
501
|
|
464
502
|
# Abort if this job attempts to override secure mode
|
@@ -511,6 +549,10 @@ class LaunchAgent:
|
|
511
549
|
KeyboardInterrupt: if the agent is requested to stop.
|
512
550
|
"""
|
513
551
|
self.print_status()
|
552
|
+
if self._verbosity == 0:
|
553
|
+
print_interval = DEFAULT_PRINT_INTERVAL
|
554
|
+
else:
|
555
|
+
print_interval = VERBOSE_PRINT_INTERVAL
|
514
556
|
try:
|
515
557
|
while True:
|
516
558
|
job = None
|
@@ -532,7 +574,7 @@ class LaunchAgent:
|
|
532
574
|
file_saver = RunQueueItemFileSaver(
|
533
575
|
self._wandb_run, job["runQueueItemId"]
|
534
576
|
)
|
535
|
-
if _is_scheduler_job(job.get("runSpec", {})):
|
577
|
+
if self._is_scheduler_job(job.get("runSpec", {})):
|
536
578
|
# If job is a scheduler, and we are already at the cap, ignore,
|
537
579
|
# don't ack, and it will be pushed back onto the queue in 1 min
|
538
580
|
if self.num_running_schedulers >= self._max_schedulers:
|
@@ -567,6 +609,7 @@ class LaunchAgent:
|
|
567
609
|
await self.update_status(AGENT_POLLING)
|
568
610
|
else:
|
569
611
|
await self.update_status(AGENT_RUNNING)
|
612
|
+
if time.time() - self._last_status_print_time > print_interval:
|
570
613
|
self.print_status()
|
571
614
|
|
572
615
|
if self.num_running_jobs == self._max_jobs or job is None:
|
@@ -634,14 +677,14 @@ class LaunchAgent:
|
|
634
677
|
await self.check_sweep_state(launch_spec, api)
|
635
678
|
|
636
679
|
job_tracker.update_run_info(project)
|
637
|
-
|
680
|
+
self._internal_logger.info("Fetching and validating project...")
|
638
681
|
project.fetch_and_validate_project()
|
639
|
-
|
682
|
+
self._internal_logger.info("Fetching resource...")
|
640
683
|
resource = launch_spec.get("resource") or "local-container"
|
641
684
|
backend_config: Dict[str, Any] = {
|
642
685
|
PROJECT_SYNCHRONOUS: False, # agent always runs async
|
643
686
|
}
|
644
|
-
|
687
|
+
self._internal_logger.info("Loading backend")
|
645
688
|
override_build_config = launch_spec.get("builder")
|
646
689
|
|
647
690
|
_, build_config, registry_config = construct_agent_configs(
|
@@ -661,13 +704,13 @@ class LaunchAgent:
|
|
661
704
|
assert entrypoint is not None
|
662
705
|
image_uri = await builder.build_image(project, entrypoint, job_tracker)
|
663
706
|
|
664
|
-
|
707
|
+
self._internal_logger.info("Backend loaded...")
|
665
708
|
if isinstance(backend, LocalProcessRunner):
|
666
709
|
run = await backend.run(project, image_uri)
|
667
710
|
else:
|
668
711
|
assert image_uri
|
669
712
|
run = await backend.run(project, image_uri)
|
670
|
-
if _is_scheduler_job(launch_spec):
|
713
|
+
if self._is_scheduler_job(launch_spec):
|
671
714
|
with self._jobs_lock:
|
672
715
|
self._jobs[thread_id].is_scheduler = True
|
673
716
|
wandb.termlog(
|
@@ -700,7 +743,7 @@ class LaunchAgent:
|
|
700
743
|
if stopped_time is None:
|
701
744
|
stopped_time = time.time()
|
702
745
|
else:
|
703
|
-
if time.time() - stopped_time >
|
746
|
+
if time.time() - stopped_time > self._stopped_run_timeout:
|
704
747
|
await run.cancel()
|
705
748
|
await asyncio.sleep(AGENT_POLLING_INTERVAL)
|
706
749
|
|
@@ -720,7 +763,7 @@ class LaunchAgent:
|
|
720
763
|
project=launch_spec["project"],
|
721
764
|
)
|
722
765
|
except Exception as e:
|
723
|
-
|
766
|
+
self._internal_logger.debug(f"Fetch sweep state error: {e}")
|
724
767
|
state = None
|
725
768
|
|
726
769
|
if state != "RUNNING" and state != "PAUSED":
|
wandb/sdk/launch/agent/config.py
CHANGED
@@ -225,6 +225,14 @@ class AgentConfig(BaseModel):
|
|
225
225
|
None,
|
226
226
|
description="The builder to use.",
|
227
227
|
)
|
228
|
+
verbosity: Optional[int] = Field(
|
229
|
+
0,
|
230
|
+
description="How verbose to print, 0 = default, 1 = verbose, 2 = very verbose",
|
231
|
+
)
|
232
|
+
stopped_run_timeout: Optional[int] = Field(
|
233
|
+
60,
|
234
|
+
description="How many seconds to wait after receiving the stop command before forcibly cancelling a run.",
|
235
|
+
)
|
228
236
|
|
229
237
|
class Config:
|
230
238
|
extra = "forbid"
|