首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使wandb按位置传递参数?

如何使wandb按位置传递参数?
EN

Stack Overflow用户
提问于 2022-02-22 15:07:04
回答 1查看 362关注 0票数 0

我正在尝试探索python脚本"train.py“中不同参数设置的结果。为此,我用魔杖扫荡。每个wandb代理都执行文件"train.py“并将一些参数传递给它。根据wandb文档(https://docs.wandb.ai/guides/sweeps/configuration#command),在例如两个参数"param1“和"param2”的情况下,每个代理程序使用命令启动文件

代码语言:javascript
复制
/usr/bin/env python train.py --param1=value1 --param2=value2

然而,"train.py“期望

代码语言:javascript
复制
/usr/bin/env python train.py value1 value2

并按位置解析参数值。我没有写train.py,如果可能的话,我不想修改它。我如何才能让wandb在前面不使用“-parp1=”来传递值呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-22 16:51:46

不要以为你能从W&B扫描中得到位置论点。但是,您可以尝试一些不需要您触摸train.py文件的工作。

您可以创建一个调用程序文件,我们将其命名为invoke.py。现在,您可以使用它,去掉关键字参数名。像这样的东西可能会起作用:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
$ python3 invoke.py /path/to/train.py param0=0.001 param1=20 ...

现在,要执行W&B扫描,您可以在您的command:文件中创建一个参考文献节(参考文献),同时扫描参数param0param1。例如:

代码语言:javascript
复制
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}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71223654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档