我希望在使用替换字符串(例如:{%})时,将一个包含命令列表的文件传递给gnu-parallel。
不幸的是,如果使用替换字符串,gnu-parallel会将文件中的命令解释为/bin/bash的参数。
这是我想要做的:
parallel -j 8 'CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txt其中,commands.txt的内容是:
/path/to/binary -arg1 a -arg2 1.0
/path/to/binary -arg1 a -arg2 1.1
...
/path/to/binary -arg1 z -arg2 9.9但是,这会引发以下错误:
/bin/bash: /path/to/binary -arg1 a -arg2 1.0: command not found我希望GNU并行运行:
CUDA_VISIBLE_DEVICES=0 /path/to/binary -arg1 a -arg2 1.0环境变量CUDA_VISIBLE_DEVICES的目的是让每个进程在不同的GPU上运行(默认情况下,所有进程都在同一个GPU上运行)。如果我不需要CUDA_VISIBLE_DEVICES,下面的代码就可以完美地工作了:
parallel -j 8 < commands.txt我怎么才能避免这个问题呢?
发布于 2019-01-18 20:10:34
虽然--colsep有时可以工作,但它并不总是正确的选择。这将创建文件abc和def
echo 'touch abc\ def' | parallel -v --colsep ' ' A=B {}通常,使用eval去掉表达式的引号会更好
echo 'touch abc\ def' | parallel -v eval A=B {}所以:
parallel -j 8 'eval CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txt如果您经常使用$(({%} - 1)),请考虑使用您自己的替换字符串:
echo '--rpl {%-1}\ $_=slot()-1' >> ~/.parallel/config
parallel -j 8 'eval CUDA_VISIBLE_DEVICES={%-1} {}' < commands.txt或者甚至是:
echo '--rpl '"'"'{CUDA} $_="CUDA_VISIBLE_DEVICES=".(slot()-1)'"'" >> .parallel/config
parallel -j 8 'eval {CUDA} {}' < commands.txt发布于 2019-01-18 06:36:03
使用--colsep ' '可以做到这一点:
parallel -j 8 --colsep ' ' 'CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txthttps://stackoverflow.com/questions/54243732
复制相似问题