在许多进程/计算机上多次运行函数

cluster-func的Python项目详细描述


#cluster func是一个命令行工具,它可以让您使用python编写的解决方案进行令人尴尬的并行扩展,不需要额外的代码。

git://github.com/enewel101/cluster func
cd cluster func
python setup.py develop
``````



我经常发现自己在编写多处理和任务划分/调度的样板代码,尽管这些代码在概念上很简单,但却很乏味而且容易出错。

假设您可以方便地让shell输出参数值。但通常情况并非如此,而且
您可能希望您的参数是任意的python类型,而不是字符串。


当然,hadoop也很不错,假设您有很多时间来进行
配置,并且您的映射器和还原器不需要太多的
内存,你已经在hdfs中加载了所有的数据,
,而且地图的结果不会产生太多的数据,也不会让网络崩溃。哦,假设
您喜欢编写样板映射器和还原器代码…等等,也许hadoop不太好……(好吧,好吧,它确实有它的位置!)

这种令人尴尬的可并行化问题经常出现。至少,一个解决方案需要定义要重复调用的函数和所有不同的参数。

cluster func假设您已经在python脚本中以*可调用*和*可访问*的形式定义了
,然后
它处理跨核心和机器分发工作的业务。

无论如何,当你为一个进程编写代码时有两件事。因此,您基本上可以免费获得
多处理和集群处理!

工具有两种模式。在**直接模式**,它在
一台机器的CPU上运行您的功能。在**调度模式**中,它将工作分解为子任务,子任务可以在不同的机器上运行,还可以选择使用"qsub"将它们提交给作业调度程序


从"args"生成,
生成的工作线程数量与
计算机上用户可用的CPU核心数量相同。

若要为目标函数或参数iterable使用其他名称,
或使用不同数量的工作进程,请执行以下操作:
``bash
$cluf my戋script.py--target=my戋func--args=my戋iterable--processes=12戋short options-t,-a,-p
```

内容将被解包并解释为一次调用目标函数的
位置参数。如果您需要更大的控制,例如,提供关键字参数,请参见
**<;a href="arguments iterable">;arguments iterable<;/a>;**

`args`也可以是一个可调用的,它*返回*一个iterable(包括生成器),
,这通常更方便。在直接模式下使用"cluf"可以在没有池
或队列的情况下多处理任何脚本,甚至可以导入多处理。但是,如果您真的需要向上扩展
,那么您需要使用分派模式。


但您仍然可以使用"cluf"在不使用"qsub"的机器之间分散工作。


指定要使用的多个计算节点(可以使用"-mode"强制运行模式,请参见**<;a
10个subsubsub,并使用qsub提交它们。它通过编写小的shell脚本来实现这一点,每个脚本都负责调用iterable生成的参数子集上的目标函数。

(要了解如何为子任务脚本设置pbs指令,请参见**<;a
pbs
options<;a>;**如下。)


因为每个子作业脚本都是有效的shell脚本,如果它们不是使用"qsub"的群集的一部分,则可以在单独的计算机上手动运行它们。
只需关闭"队列"选项,脚本将被创建,但不会进入队列。这也是在提交之前测试运行一个subsubobs
的好方法。

如果您不能或不想用这种方式编写iterable,请参阅**<;a href="如何划分工时">;如何划分工时<;/a>;**了解其他选项。

这将涵盖大多数基本用例。要了解更多酷功能,请继续阅读!

当然,
python语言提供了一种非常灵活的函数调用方式,允许您混合位置参数
和关键字参数。如果需要这种灵活性,那么设置迭代器
以生成"cluster\u func.arguments"对象。这个类充当代理,并且
将被用来调用您的目标函数,就像您调用
`Arguments`构造函数一样。

*[1,2,3],four=4,**{five':5,'six':6})
>;
>;我的参数
"六":6})
````

然后,每个子作业只能对分配给它的参数执行目标函数。

例如,如果有10个子对象,子对象7将运行参数7、17、27,
…等等。为了便于解释,我们将该子集称为"bin 7"。


如果在编辑器中打开子作业脚本,您会发现它们实际上在*direct mode*中调用"cluf"本身。换句话说,当您在分派模式下运行
`cluf'时,它会创建在直接模式下调用'cluf'的脚本。


例如,这个命令:
``bash
$cluf my廑script--b in=0/3廑short option:-b
````
将在直接模式下运行'cluf',但只执行落入3个bin中的0
的迭代,即迭代0、3、6、9等(bin是零索引的)。

如果愿意,可以手动分配多个容器给一个子作业,例如,选项
`--bins=0-2,5/10`将分配容器0、1、2和5(总共10个容器中的一个)。

在执行每个子作业期间,iterable的uments将以相同的顺序产生相同的参数。
如果您不能确保这一点,那么binning可以基于参数本身,
而不是它们的顺序。

您可以指示"cluf"散列一个或多个
参数以确定其bin。

正在执行:
``bash
$cluf example--nodes=12--hash=0 short options:-n和-x
````
将指示"cluf"散列每个迭代的第一个参数,以决定该迭代属于哪个bin。

在散列之前,"cluf"对参数调用"str"。
为散列选择的参数必须具有反映其值的稳定字符串表示。使用不
实现"str"的对象不会起作用,这是因为它们的字符串表示形式
不反映它们的值,而且它们的内存地址出现在
中,这在每个子对象中都是不同的。但是,出于这个目的,列表
将被视为"可散列的"(前提是它的各个元素是)。另一方面,dict和set不合适,因为它们是无序的,所以它们的字符串表示不稳定。一种安全的方法是简单地
提供一个唯一id的参数,并选择它进行哈希运算。

但是,偶尔的重复不会造成太大的负荷不平衡。为了帮助实现惟一性,可以提供要散列的参数的组合。如果提供
参数作为关键字参数(使用Arguments对象),也可以选择它们


以及关键字参数。如果在
迭代中缺少任何散列参数(因为调用可能使用不同数量的参数)。
在计算散列时,只需编写它们。

若要激活直接赋值并指定应将哪个
参数解释为bin,请在上面的命令中使用"-key"选项:

``bash
$cluf example--nodes=12--key=2短选项:-n和-k
```
,位置2中的参数(第三个参数)
将被解释为每次迭代的bin。还可以按名称指定关键字参数。

它还将作业划分逻辑引入到脚本中,而"cluf"的设计初衷是为了防止这种情况发生。


`在目标脚本中控制"cluf"的行为。如果需要设置很多选项,这比命令行更方便,并且有助于记录所使用的选项。您还可以在`~/.clufrc`的文件中全局设置选项。

可以在命令行上设置的所有选项都可以在"cluf\u options"
或".clufrc"中设置,外加一些附加选项。但是有一个例外,那就是
强制直接/分派模式的选项(`--mode`或`-m`),只能在命令行上设置


`cluf_options`应该是一个字典,其键是长选项名,
,其值是表示选项的字符串输入的值命令行。`.clufrc`应该是一个有效的json对象,具有相同的键值格式。请参阅以下示例:

**使用"cluf"选项`**
(在"my script.py"中)
``python
cluf选项{
"hash":(0,1,2,5),或使用"0-2,5"。也适用于.clufrc
"nodes":12,
"queue":基于值的真实性的真标志选项
}
```

**使用`.clufrc`**
(在`~/.clufrc`)
``json
{
"hash":[0,1,2,5],
"nodes":12,
"queue":true
}
```

您可以通过使用"from clusterf_func import rc_params"导入这些选项来访问
`.clufrc`选项。

在"cluf_options"和"clufrc"中。我们现在使用一些不太方便在命令行上设置的选项来覆盖

请参见**<;a href="reference">;参考<;/a>;**对于所有可用的选项。


\如果在*direct模式下运行'cluf',就没有什么可以考虑的了,脚本将继承当前环境。

如果在分派模式下运行"cluf",则作业脚本将在不同的环境中运行。使用"env"选项指定运行subsubbs时应设置的任何
环境变量。` env'should
应该是'cluf_options'或'.clufrc'中的字典,它有变量名
作为键和值,还有值:

(在'my_script.py'中)
``python
cluf options={
'env':{
'myenv':'foo',
'other env':'bar',
}
}
```

(在`~/.clufrc`)
```json
{
"env":{
"myenv":"foo",
"other-env":"bar"
}
}
````

如果在命令行中提供,"env"的内容将按原样粘贴在子作业脚本中运行子作业的行前面。因此,等价的'env'规范应该是:
`` bash
cluf my_script.py--nodes=4--env='myenv=foo other_env=bar'
````

这些方法中的每一个都将导致subjob中subjob的调用如下所示:
`` bash
myenv=foo other_env=bar cluf我的脚本[…选项]
```

注意,无论在何处指定,如果要为包含需要转义的空格或其他字符的环境变量提供
值,请记住,python命令行的一轮解释,或者json会发生(取决于它的设置位置)

因此,例如,这不会起作用:
``bash
cluf my_script.py--nodes=4--env='myenv=foo bar'
```
,这:
``bash
cluf myu script.py--nodes=4--env=myenv=myenv=foo\bar
``````````bash
`` bash
cluf myun script.py--nodes=4--env=myenv=foo\bar'
````````bash
``bash
cluf my script.py--nodes=4--env=myenv=myenv=foo\bar
>```

a name="pbs options">;pbs options<;/a>;
(此选项不能在命令行上设置。)
可移植批处理系统选项控制群集计划程序如何计划您的
作业,并允许您请求特定的计算资源并指定作业应花费的
时间量。运行。
一般情况下,应使用键值对字典设置pbs选项
使用选项名称作为键。例如,请求你的
子组件运行在至少有4个CPU核和2个GPU的计算节点上,你可以这样做:

(在"my script.py"中)
``python
cluf选项={
'pbs选项:{'ppn':4,"gpu":2}
}
```

(在`~/.clufrc`)
```json
{
"pbs撸options":{"ppn":4,"gpu":2}
}
`````

"ppn"(每个节点的进程)选项通常应与"processes"选项(无论是否在命令行上设置)设置的工作进程数相匹配,
"cluf"选项,或在"clufrc"中)。因此,如果在
pbs选项中未显式设置"ppn",但设置了"processes",则它将默认为
"processes"的值。如果您的目标
函数本身产生过程,您仍然可以为ppn设置不同的值。


这些选项被设置为默认值,除非
被特别重写。

-`'name`:在作业计划程序中显示的子作业的名称。
这也用于命名子作业脚本(通过附加'.pbs'`)。
默认值是格式字符串`"{target}-{subjob}-{num_subjob s}`,
字段分别由目标模块的名称、子任务号和subjobs的总数插入。
如果覆盖
,也可以使用这些格式字段,并且您必须至少使用
`{subjob}`字段来确保每个subjob都有一个
唯一的名称(否则subjob脚本将互相覆盖)。
-`'stdout`:放置从subjob捕获的stdout的路径,
相对于'jobs目录(如果没有设置然后设置它与当前工作目录相关。
默认为子作业名称加上".stdout"`
对于"name"选项,
如果重写此选项,通过在某处使用{node-num}`字段,确保subsubobs
的路径是唯一的。
-`'stderr`:类似于`'stdout`。默认为子作业名加上
`.stderr`

可用和/或必需的PBS选项的组合取决于群集的设置。通常,系统配置有智能默认值
,这样您就可以在不设置任何pbs选项的情况下对简单作业进行排队。



指定要在子作业脚本中显示的任何其他语句。这比简单地设置环境变量提供了更大的灵活性。您可以包括一个外部脚本,它的语句在使用prepend脚本运行subjob的行之前合并到作业脚本中。在使用"append_script"选项运行子作业的行*后包含外部脚本。

如果您只想添加一个或两个语句,将它们放在目标脚本(或`.clufrc`)中可能更方便。
可以使用"prepend_statements"和"append_statements"选项提供一个
shell语句列表,该列表在实际运行subjob脚本中subjob的
行之前或之后插入。列表
的每个元素都应该是一个有效的shell语句,当将
合并到jobscripts中时,它将出现在自己的行上。命令行上没有可用的选项。

作为命令行参数,或
2。在目标模块中,在名为"cluf_options"或
3的字典中。在`~/.clufrc`文件中,以json对象的形式

options`目标模块或
`.clufrc`json对象中的字典应使用长选项名称标识,而不使用
前导'--'。



[-b箱][-e环境][-p前置脚本][-a附加脚本]
[-m{调度,direct}[-x hash-k key]
[-n nodes-i iterations]
target_module

在多个处理器和计算机上多次运行函数。


位置参数:
target_module指向包含目标的python module的路径
函数要多次运行。

--jobs dir jobs_dir
指定存储作业脚本的目录,并指定在执行作业期间从stdout和stdin生成的文件。如果
不存在,将创建此目录。此选项仅在调度模式下生效。
-t target,--target target
可重复调用的目标的备用名称。默认值为"target"。
-a args,--args args iterable参数的备用名称。默认值为
"args"。
-q,--queue使用qsub将生成的脚本排队。此选项
仅在调度模式下生效。
-p进程,--processs进程
要使用的处理器数。
-b容器,--b in容器可以选择指定要完成的部分工作。
表"x/y"的意思是"在y总截面中做x-th
截面。例如,"0/2"
表示将工作分成两半,并执行
第一(0)个半部分。注意x和y应该是
整数,x应该是0到y-1之间的整数。
此选项仅在直接模式下生效。
-e env,--env env提供在
运行时应设置的环境变量子作业。这是用于分派模式,
因为作业脚本将在不同的环境中运行。
在直接模式下,环境将被继承。此选项的
值应为
空格分隔键=值对的带引号字符串。例如:$cluf
my_script-n 12-e'foo=bar baz="fizz bang"'将设置
foo等于"bar",baz等于"fizz bang"。此
选项仅在分派模式下生效。
-p prepend_script,--prepend script prepend_script
指向其内容应包含在子作业脚本开头的脚本的路径,在运行子作业之前执行。可以包含多个逗号-
分隔的路径。此选项仅在
分派模式下生效。
-附加脚本,--附加脚本附加脚本
脚本路径,该脚本的内容应包含在子任务脚本的
结尾,并在
之后执行子作业完成。可以包含多个逗号-
分隔的路径。此选项仅在调度模式下生效。
-m{dispatch,direct},--mode{dispatch,direct}
显式设置操作模式。可设置为
"直接"或"派遣"。在直接模式下,作业运行,
,而在分派模式下,作业的脚本创建并可选地排队。设置-n或
-i隐式地将操作模式设置为
"分派",除非另有规定。
-x hash,--hash hash指定一个或一组参数,用于确定迭代属于哪个bin。这些
参数应具有稳定的字符串表示形式
(即没有无序的容器或内存地址),并且
在argumetns iterable上应是唯一的。只有在自动装箱不起作用的情况下,即如果参数iterable不稳定时,才应设置此值。这个关键参数应该始终采用一个0
到num-bins-1之间的整数。只有当您真正需要控制binning时,才应使用此选项。更喜欢依赖于自动的
binning(如果您的iterable是稳定的),或者使用
-xoption,它更灵活,更不容易出错。
-n nodes,--nodes nodes
compute nodes的数量。此选项使
命令在调度模式下运行,除非模式
被显式设置为
-i迭代,--iterations迭代
每个计算节点的近似迭代次数。
此选项使命令在dispatch
模式下运行,除非显式设置了模式。注意,
使用这个而不是--nodes(-n)可能会导致延迟
,因为必须对迭代总数进行
计数才能确定所需的计算节点数。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ws-consumer服务地址中的java动态属性   java如何比较整数列表,然后按升序排序?   javascript我正在使用java脚本调用一个函数,但它没有调用代码下面的方法,也没有调用secretitnames()函数   在文本窗格中多次使用Java insertIcon图标   JavaMSAL安卓。AuthenticationActivity完成,但用于身份验证请求的线程池线程仍处于等待状态   if语句中的java多范围比较   java toString()表示输出   java如何在jcstrest测试中生成指令重新排序   java我怎样才能运行它?   web应用程序中使用Hibernate和Spring的java问题   如何将字符串数据写入Java文本文件   如何在java命令提示符下运行已签名的jar文件?   java从我的菜单调用RCP应用程序   java如何等待Canvas/GraphicsContext完成任务,然后再继续执行代码块?