halib 0.2.31__tar.gz → 0.2.33__tar.gz
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.
- {halib-0.2.31 → halib-0.2.33}/.gitignore +4 -1
- halib-0.2.33/MANIFEST.in +6 -0
- {halib-0.2.31 → halib-0.2.33}/PKG-INFO +5 -2
- {halib-0.2.31 → halib-0.2.33}/README.md +4 -1
- {halib-0.2.31 → halib-0.2.33}/halib/common/common.py +14 -8
- halib-0.2.33/halib/utils/wandb_op.py +140 -0
- {halib-0.2.31 → halib-0.2.33}/halib.egg-info/PKG-INFO +5 -2
- {halib-0.2.31 → halib-0.2.33}/halib.egg-info/SOURCES.txt +2 -2
- {halib-0.2.31 → halib-0.2.33}/setup.py +1 -1
- halib-0.2.31/MANIFEST.in +0 -5
- halib-0.2.31/halib/exp/core/wandb_op.py +0 -117
- {halib-0.2.31 → halib-0.2.33}/GDriveFolder.txt +0 -0
- {halib-0.2.31 → halib-0.2.33}/LICENSE.txt +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/common/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/common/rich_color.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/core/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/core/base_config.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/core/base_exp.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/core/param_gen.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/data/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/data/dataclass_util.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/data/dataset.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/data/torchloader.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/flop_calc.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/gpu_mon.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/perfcalc.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/perfmetrics.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/perftb.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/perf/profiler.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/viz/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/exp/viz/plot.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/csvfile.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/ipynb.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/jsonfile.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/textfile.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/videofile.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/filetype/yamlfile.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/online/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/online/gdrive.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/online/gdrive_mkdir.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/online/projectmake.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/online/tele_noti.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/system/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/system/_list_pc.csv +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/system/cmd.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/system/filesys.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/system/path.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/utils/__init__.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/utils/dict.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/utils/list.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib/utils/slack.py +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib.egg-info/dependency_links.txt +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib.egg-info/requires.txt +0 -0
- {halib-0.2.31 → halib-0.2.33}/halib.egg-info/top_level.txt +0 -0
- {halib-0.2.31 → halib-0.2.33}/setup.cfg +0 -0
halib-0.2.33/MANIFEST.in
ADDED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: halib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.33
|
|
4
4
|
Summary: Small library for common tasks
|
|
5
5
|
Author: Hoang Van Ha
|
|
6
6
|
Author-email: hoangvanhauit@gmail.com
|
|
@@ -57,7 +57,10 @@ Dynamic: summary
|
|
|
57
57
|
|
|
58
58
|
## v0.2.x (Experiment & Core Updates)
|
|
59
59
|
|
|
60
|
-
### **v0.2.
|
|
60
|
+
### **v0.2.33**
|
|
61
|
+
|
|
62
|
+
- 🚀 **Improvement:**: move `wandb_op.py` to `utils` and add `scripts` folder
|
|
63
|
+
|
|
61
64
|
|
|
62
65
|
- ✨ **New Feature:**: add `common.common.log_func` as decorator to log function entry, exit, with execution time and arguments.
|
|
63
66
|
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
## v0.2.x (Experiment & Core Updates)
|
|
4
4
|
|
|
5
|
-
### **v0.2.
|
|
5
|
+
### **v0.2.33**
|
|
6
|
+
|
|
7
|
+
- 🚀 **Improvement:**: move `wandb_op.py` to `utils` and add `scripts` folder
|
|
8
|
+
|
|
6
9
|
|
|
7
10
|
- ✨ **New Feature:**: add `common.common.log_func` as decorator to log function entry, exit, with execution time and arguments.
|
|
8
11
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from fiftyone.brain.internal.core.lancedb import pa
|
|
1
2
|
import os
|
|
2
3
|
import sys
|
|
3
4
|
import re
|
|
@@ -280,6 +281,9 @@ def log_func(
|
|
|
280
281
|
func_name = getattr(func, "__name__", "Unknown_Func")
|
|
281
282
|
skip_list = skip_idxs or []
|
|
282
283
|
|
|
284
|
+
SUMMARY_WIDTH = 80
|
|
285
|
+
SUB_SUMMARY_WIDTH = 50
|
|
286
|
+
|
|
283
287
|
with ConsoleLog(func_name):
|
|
284
288
|
start = time.perf_counter()
|
|
285
289
|
try:
|
|
@@ -288,22 +292,24 @@ def log_func(
|
|
|
288
292
|
end = time.perf_counter()
|
|
289
293
|
|
|
290
294
|
if log_time or log_args:
|
|
291
|
-
console.print(
|
|
295
|
+
console.print(
|
|
296
|
+
pad_string(f"Func <{func_name}> summary", SUMMARY_WIDTH)
|
|
297
|
+
)
|
|
292
298
|
|
|
293
299
|
if log_args:
|
|
294
|
-
console.print(f"
|
|
300
|
+
console.print(pad_string(f"Args Summary", SUMMARY_WIDTH))
|
|
295
301
|
# Log Positional Args line-by-line
|
|
296
302
|
for i, val in enumerate(args):
|
|
297
|
-
if i in skip_list
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
pprint(f" arg[{i}]: \n {val}")
|
|
301
|
-
|
|
303
|
+
val = "SKIPPED" if i in skip_list else val
|
|
304
|
+
console.print(pad_string(f"arg[{i}]", SUB_SUMMARY_WIDTH))
|
|
305
|
+
pprint(val)
|
|
302
306
|
# Log Keyword Args line-by-line
|
|
303
307
|
for k, v in kwargs.items():
|
|
304
|
-
|
|
308
|
+
console.print(pad_string(f"{k}", SUB_SUMMARY_WIDTH))
|
|
309
|
+
pprint(v)
|
|
305
310
|
|
|
306
311
|
if log_time:
|
|
312
|
+
console.print(pad_string(f"Time Summary", SUMMARY_WIDTH))
|
|
307
313
|
console.print(f"{func_name} took {end - start:.6f} seconds")
|
|
308
314
|
|
|
309
315
|
return result
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import glob
|
|
2
|
+
import wandb
|
|
3
|
+
import subprocess
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Optional, Literal
|
|
6
|
+
|
|
7
|
+
from tap import Tap
|
|
8
|
+
from tqdm import tqdm
|
|
9
|
+
|
|
10
|
+
from rich.console import Console
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
wandb_console = Console()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# --- Argument Parser ---
|
|
17
|
+
class WandbArgs(Tap):
|
|
18
|
+
# --- Auth ---
|
|
19
|
+
api_key_yaml: Path = Path(
|
|
20
|
+
"E:/Dev/__halib/.env.yaml"
|
|
21
|
+
) # Path to YAML file containing W&B API key
|
|
22
|
+
|
|
23
|
+
# --- Operations ---
|
|
24
|
+
op: Literal["sync", "delete"] = "delete" # Operation to perform
|
|
25
|
+
|
|
26
|
+
# --- Project & Filtering ---
|
|
27
|
+
project: str = "paper2_main" # W&B project name
|
|
28
|
+
pattern: Optional[str] = None # Run name pattern to match for deletion
|
|
29
|
+
|
|
30
|
+
# --- Paths ---
|
|
31
|
+
outdir: Path = Path("./zout/zruns") # Directory containing runs to sync
|
|
32
|
+
|
|
33
|
+
def configure(self):
|
|
34
|
+
self.add_argument("-prj", "--project")
|
|
35
|
+
self.add_argument("-pt", "--pattern")
|
|
36
|
+
self.add_argument("-o", "--outdir")
|
|
37
|
+
self.add_argument("-k", "--api_key_yaml")
|
|
38
|
+
|
|
39
|
+
def validate(self):
|
|
40
|
+
if self.op == "sync" and not self.outdir.exists():
|
|
41
|
+
raise ValueError(f"Output directory {self.outdir} does not exist.")
|
|
42
|
+
if self.op == "delete" and not self.project.strip():
|
|
43
|
+
raise ValueError("Project name must be a non-empty string.")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def login_wandb(api_key: Optional[str]):
|
|
47
|
+
"""Handles authentication with Weights & Biases."""
|
|
48
|
+
try:
|
|
49
|
+
if api_key:
|
|
50
|
+
# Explicit login with key
|
|
51
|
+
wandb.login(key=api_key)
|
|
52
|
+
wandb_console.print(
|
|
53
|
+
"[green]Successfully logged into W&B using provided API key.[/green]"
|
|
54
|
+
)
|
|
55
|
+
else:
|
|
56
|
+
# Attempts to find key in environment variables or netrc file
|
|
57
|
+
if wandb.login():
|
|
58
|
+
wandb_console.print(
|
|
59
|
+
"[blue]Logged into W&B using existing credentials.[/blue]"
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
wandb_console.print(
|
|
63
|
+
"[red]Authentication failed. Please provide an API key with -k.[/red]"
|
|
64
|
+
)
|
|
65
|
+
exit(1)
|
|
66
|
+
except Exception as e:
|
|
67
|
+
wandb_console.print(f"[bold red]Login Error:[/bold red] {e}")
|
|
68
|
+
exit(1)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# --- Logic Functions ---
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def sync_runs(outdir: Path):
|
|
75
|
+
outdir_path = outdir.absolute()
|
|
76
|
+
sub_dirs = [d for d in outdir_path.iterdir() if d.is_dir()]
|
|
77
|
+
|
|
78
|
+
if not sub_dirs:
|
|
79
|
+
wandb_console.print(f"[red]No subdirectories found in {outdir_path}.[/red]")
|
|
80
|
+
return
|
|
81
|
+
|
|
82
|
+
wandb_console.rule(f"Syncing from {outdir_path}")
|
|
83
|
+
|
|
84
|
+
wandb_dirs = []
|
|
85
|
+
for exp_dir in sub_dirs:
|
|
86
|
+
wandb_dirs.extend(glob.glob(str(exp_dir / "wandb" / "*run-*")))
|
|
87
|
+
|
|
88
|
+
if not wandb_dirs:
|
|
89
|
+
wandb_console.print("No wandb runs found.")
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
for i, wandb_dir in enumerate(wandb_dirs):
|
|
93
|
+
wandb_console.print(f"[{i+1}/{len(wandb_dirs)}] Syncing: {wandb_dir}")
|
|
94
|
+
|
|
95
|
+
# Note: 'wandb sync' command uses the credentials from wandb.login()
|
|
96
|
+
process = subprocess.Popen(
|
|
97
|
+
["wandb", "sync", wandb_dir],
|
|
98
|
+
stdout=subprocess.PIPE,
|
|
99
|
+
stderr=subprocess.STDOUT,
|
|
100
|
+
text=True,
|
|
101
|
+
)
|
|
102
|
+
for line in process.stdout: # ty:ignore[not-iterable]
|
|
103
|
+
if "ERROR" in line:
|
|
104
|
+
wandb_console.print(f"[red]{line.strip()}[/red]")
|
|
105
|
+
process.wait()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def delete_runs(project: str, pattern: Optional[str]):
|
|
109
|
+
api = wandb.Api()
|
|
110
|
+
runs = api.runs(project)
|
|
111
|
+
|
|
112
|
+
deleted = 0
|
|
113
|
+
for run in tqdm(runs, desc="Processing runs"):
|
|
114
|
+
if pattern is None or pattern in run.name:
|
|
115
|
+
run.delete()
|
|
116
|
+
deleted += 1
|
|
117
|
+
wandb_console.print(f"[green]Total runs deleted: {deleted}[/green]")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def main():
|
|
121
|
+
args = WandbArgs().parse_args()
|
|
122
|
+
cfg_dict = {}
|
|
123
|
+
with open(args.api_key_yaml, "r") as f:
|
|
124
|
+
cfg_dict = yaml.safe_load(f)
|
|
125
|
+
wandb_api_key = cfg_dict.get("WANDB_API_KEY")
|
|
126
|
+
assert (
|
|
127
|
+
wandb_api_key is not None
|
|
128
|
+
), "W&B API key not found in the specified YAML file."
|
|
129
|
+
# 1. Login first
|
|
130
|
+
login_wandb(wandb_api_key)
|
|
131
|
+
|
|
132
|
+
# 2. Execute operation
|
|
133
|
+
if args.op == "sync":
|
|
134
|
+
sync_runs(args.outdir)
|
|
135
|
+
elif args.op == "delete":
|
|
136
|
+
delete_runs(args.project, args.pattern)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: halib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.33
|
|
4
4
|
Summary: Small library for common tasks
|
|
5
5
|
Author: Hoang Van Ha
|
|
6
6
|
Author-email: hoangvanhauit@gmail.com
|
|
@@ -57,7 +57,10 @@ Dynamic: summary
|
|
|
57
57
|
|
|
58
58
|
## v0.2.x (Experiment & Core Updates)
|
|
59
59
|
|
|
60
|
-
### **v0.2.
|
|
60
|
+
### **v0.2.33**
|
|
61
|
+
|
|
62
|
+
- 🚀 **Improvement:**: move `wandb_op.py` to `utils` and add `scripts` folder
|
|
63
|
+
|
|
61
64
|
|
|
62
65
|
- ✨ **New Feature:**: add `common.common.log_func` as decorator to log function entry, exit, with execution time and arguments.
|
|
63
66
|
|
|
@@ -18,7 +18,6 @@ halib/exp/core/__init__.py
|
|
|
18
18
|
halib/exp/core/base_config.py
|
|
19
19
|
halib/exp/core/base_exp.py
|
|
20
20
|
halib/exp/core/param_gen.py
|
|
21
|
-
halib/exp/core/wandb_op.py
|
|
22
21
|
halib/exp/data/__init__.py
|
|
23
22
|
halib/exp/data/dataclass_util.py
|
|
24
23
|
halib/exp/data/dataset.py
|
|
@@ -52,4 +51,5 @@ halib/system/path.py
|
|
|
52
51
|
halib/utils/__init__.py
|
|
53
52
|
halib/utils/dict.py
|
|
54
53
|
halib/utils/list.py
|
|
55
|
-
halib/utils/slack.py
|
|
54
|
+
halib/utils/slack.py
|
|
55
|
+
halib/utils/wandb_op.py
|
halib-0.2.31/MANIFEST.in
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import glob
|
|
3
|
-
import wandb
|
|
4
|
-
import argparse
|
|
5
|
-
import subprocess
|
|
6
|
-
|
|
7
|
-
from tqdm import tqdm
|
|
8
|
-
from rich.console import Console
|
|
9
|
-
|
|
10
|
-
console = Console()
|
|
11
|
-
|
|
12
|
-
def sync_runs(outdir):
|
|
13
|
-
outdir = os.path.abspath(outdir)
|
|
14
|
-
assert os.path.exists(outdir), f"Output directory {outdir} does not exist."
|
|
15
|
-
sub_dirs = [name for name in os.listdir(outdir) if os.path.isdir(os.path.join(outdir, name))]
|
|
16
|
-
assert len(sub_dirs) > 0, f"No subdirectories found in {outdir}."
|
|
17
|
-
console.rule("Parent Directory")
|
|
18
|
-
console.print(f"[yellow]{outdir}[/yellow]")
|
|
19
|
-
|
|
20
|
-
exp_dirs = [os.path.join(outdir, sub_dir) for sub_dir in sub_dirs]
|
|
21
|
-
wandb_dirs = []
|
|
22
|
-
for exp_dir in exp_dirs:
|
|
23
|
-
wandb_dirs.extend(glob.glob(f"{exp_dir}/wandb/*run-*"))
|
|
24
|
-
if len(wandb_dirs) == 0:
|
|
25
|
-
console.print(f"No wandb runs found in {outdir}.")
|
|
26
|
-
return
|
|
27
|
-
else:
|
|
28
|
-
console.print(f"Found [bold]{len(wandb_dirs)}[/bold] wandb runs in {outdir}.")
|
|
29
|
-
for i, wandb_dir in enumerate(wandb_dirs):
|
|
30
|
-
console.rule(f"Syncing wandb run {i + 1}/{len(wandb_dirs)}")
|
|
31
|
-
console.print(f"Syncing: {wandb_dir}")
|
|
32
|
-
process = subprocess.Popen(
|
|
33
|
-
["wandb", "sync", wandb_dir],
|
|
34
|
-
stdout=subprocess.PIPE,
|
|
35
|
-
stderr=subprocess.STDOUT,
|
|
36
|
-
text=True,
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
for line in process.stdout:
|
|
40
|
-
console.print(line.strip())
|
|
41
|
-
if " ERROR Error while calling W&B API" in line:
|
|
42
|
-
break
|
|
43
|
-
process.stdout.close()
|
|
44
|
-
process.wait()
|
|
45
|
-
if process.returncode != 0:
|
|
46
|
-
console.print(f"[red]Error syncing {wandb_dir}. Return code: {process.returncode}[/red]")
|
|
47
|
-
else:
|
|
48
|
-
console.print(f"Successfully synced {wandb_dir}.")
|
|
49
|
-
|
|
50
|
-
def delete_runs(project, pattern=None):
|
|
51
|
-
console.rule("Delete W&B Runs")
|
|
52
|
-
confirm_msg = f"Are you sure you want to delete all runs in"
|
|
53
|
-
confirm_msg += f" \n\tproject: [red]{project}[/red]"
|
|
54
|
-
if pattern:
|
|
55
|
-
confirm_msg += f"\n\tpattern: [blue]{pattern}[/blue]"
|
|
56
|
-
|
|
57
|
-
console.print(confirm_msg)
|
|
58
|
-
confirmation = input(f"This action cannot be undone. [y/N]: ").strip().lower()
|
|
59
|
-
if confirmation != "y":
|
|
60
|
-
print("Cancelled.")
|
|
61
|
-
return
|
|
62
|
-
|
|
63
|
-
print("Confirmed. Proceeding...")
|
|
64
|
-
api = wandb.Api()
|
|
65
|
-
runs = api.runs(project)
|
|
66
|
-
|
|
67
|
-
deleted = 0
|
|
68
|
-
console.rule("Deleting W&B Runs")
|
|
69
|
-
if len(runs) == 0:
|
|
70
|
-
print("No runs found in the project.")
|
|
71
|
-
return
|
|
72
|
-
for run in tqdm(runs):
|
|
73
|
-
if pattern is None or pattern in run.name:
|
|
74
|
-
run.delete()
|
|
75
|
-
console.print(f"Deleted run: [red]{run.name}[/red]")
|
|
76
|
-
deleted += 1
|
|
77
|
-
|
|
78
|
-
console.print(f"Total runs deleted: {deleted}")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def valid_argument(args):
|
|
82
|
-
if args.op == "sync":
|
|
83
|
-
assert os.path.exists(args.outdir), f"Output directory {args.outdir} does not exist."
|
|
84
|
-
elif args.op == "delete":
|
|
85
|
-
assert isinstance(args.project, str) and len(args.project.strip()) > 0, "Project name must be a non-empty string."
|
|
86
|
-
else:
|
|
87
|
-
raise ValueError(f"Unknown operation: {args.op}")
|
|
88
|
-
|
|
89
|
-
def parse_args():
|
|
90
|
-
parser = argparse.ArgumentParser(description="Operations on W&B runs")
|
|
91
|
-
parser.add_argument("-op", "--op", type=str, help="Operation to perform", default="sync", choices=["delete", "sync"])
|
|
92
|
-
parser.add_argument("-prj", "--project", type=str, default="fire-paper2-2025", help="W&B project name")
|
|
93
|
-
parser.add_argument("-outdir", "--outdir", type=str, help="arg1 description", default="./zout/train")
|
|
94
|
-
parser.add_argument("-pt", "--pattern",
|
|
95
|
-
type=str,
|
|
96
|
-
default=None,
|
|
97
|
-
help="Run name pattern to match for deletion",
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
return parser.parse_args()
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def main():
|
|
104
|
-
args = parse_args()
|
|
105
|
-
# Validate arguments, stop if invalid
|
|
106
|
-
valid_argument(args)
|
|
107
|
-
|
|
108
|
-
op = args.op
|
|
109
|
-
if op == "sync":
|
|
110
|
-
sync_runs(args.outdir)
|
|
111
|
-
elif op == "delete":
|
|
112
|
-
delete_runs(args.project, args.pattern)
|
|
113
|
-
else:
|
|
114
|
-
raise ValueError(f"Unknown operation: {op}")
|
|
115
|
-
|
|
116
|
-
if __name__ == "__main__":
|
|
117
|
-
main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|