如何让 wandb 按位置传递参数?
How to get wandb to pass arguments by position?
我正在尝试探索 python 脚本“train.py”中不同参数设置的结果。为此,我使用 wandb 扫描。每个 wandb 代理执行文件“train.py”并向其传递一些参数。根据 wandb 文档 (https://docs.wandb.ai/guides/sweeps/configuration#command),例如两个参数“param1”和“param2”每个代理使用命令启动文件
/usr/bin/env python train.py --param1=value1 --param2=value2
但是,“train.py”期望
/usr/bin/env python train.py value1 value2
并按位置解析参数值。我没有写 train.py 并且希望尽可能不更改它。如何让 wandb 传递前面没有“--param1=”的值?
不要认为您可以从 W&B 扫描中获得位置参数。但是,您可以尝试一些不需要触摸 train.py
文件的解决方法。
您可以创建一个调用程序文件,我们称它为invoke.py
。现在,您可以使用它摆脱关键字参数名称。这样的事情可能会奏效:
import sys
import subprocess
if len(sys.argv[0]) <= 1:
print(f"{sys.argv[0]} program_name param0=<param0> param1=<param1> ...")
sys.exit(0)
program = sys.argv[1]
params = sys.argv[2:]
posparam = []
for param in params:
_, val = param.split("=")
posparam.append(val)
command = [sys.executable, program, *posparam]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
sys.stdout.write(out.decode())
sys.stdout.flush()
sys.stderr.write(err.decode())
sys.stderr.flush()
sys.exit(process.returncode)
这允许您按如下方式调用 train.py
文件:
$ python3 invoke.py /path/to/train.py param0=0.001 param1=20 ...
现在要执行 W&B 扫描,您可以在 sweeps.yaml
文件中创建一个 command:
部分 (reference),同时扫描参数 param0
和 param1
.例如:
program: invoke.py
...
parameters:
param0:
distribution: uniform
min: 0
max: 1
param1:
distribution: categorical
values: [10, 20, 30]
command:
- ${env}
- ${program}
- /path/to/train.py
- ${args_no_hyphens}
我正在尝试探索 python 脚本“train.py”中不同参数设置的结果。为此,我使用 wandb 扫描。每个 wandb 代理执行文件“train.py”并向其传递一些参数。根据 wandb 文档 (https://docs.wandb.ai/guides/sweeps/configuration#command),例如两个参数“param1”和“param2”每个代理使用命令启动文件
/usr/bin/env python train.py --param1=value1 --param2=value2
但是,“train.py”期望
/usr/bin/env python train.py value1 value2
并按位置解析参数值。我没有写 train.py 并且希望尽可能不更改它。如何让 wandb 传递前面没有“--param1=”的值?
不要认为您可以从 W&B 扫描中获得位置参数。但是,您可以尝试一些不需要触摸 train.py
文件的解决方法。
您可以创建一个调用程序文件,我们称它为invoke.py
。现在,您可以使用它摆脱关键字参数名称。这样的事情可能会奏效:
import sys
import subprocess
if len(sys.argv[0]) <= 1:
print(f"{sys.argv[0]} program_name param0=<param0> param1=<param1> ...")
sys.exit(0)
program = sys.argv[1]
params = sys.argv[2:]
posparam = []
for param in params:
_, val = param.split("=")
posparam.append(val)
command = [sys.executable, program, *posparam]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
sys.stdout.write(out.decode())
sys.stdout.flush()
sys.stderr.write(err.decode())
sys.stderr.flush()
sys.exit(process.returncode)
这允许您按如下方式调用 train.py
文件:
$ python3 invoke.py /path/to/train.py param0=0.001 param1=20 ...
现在要执行 W&B 扫描,您可以在 sweeps.yaml
文件中创建一个 command:
部分 (reference),同时扫描参数 param0
和 param1
.例如:
program: invoke.py
...
parameters:
param0:
distribution: uniform
min: 0
max: 1
param1:
distribution: categorical
values: [10, 20, 30]
command:
- ${env}
- ${program}
- /path/to/train.py
- ${args_no_hyphens}