0

我正在尝试在我的 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=”的值?

4

1 回答 1

0

不要认为您可以从 W&B Sweeps 获得位置参数。但是,您可以尝试一些不需要触摸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 扫描,您可以在文件中创建一个command:部分(参考),sweeps.yaml同时扫描参数param0param1. 例如:

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}
于 2022-02-22T16:51:46.457 回答