在多台服务器上无痛苦地训练多个程序

training-noodles的Python项目详细描述


拉面

documentation_linktravis_build_status

这是一个简单而强大的工具,可以帮助在只有一个人的multiple服务器上训练multiple程序。

功能

  • 自动将实验部署到可用服务器
  • 无需更改任何现有代码
  • 考虑CPU使用率、GPU使用率、内存使用率、磁盘使用率等
  • 仅使用ssh协议
  • 依赖于最小的依赖性
  • 允许快速原型制作

用例

如果我们想在3台服务器上运行4个实验,更具体地说,我们需要

  1. 将代码上载到CPU使用率较低的服务器之一
  2. 在服务器上运行代码
  3. 准备好后下载实验结果

deployment_round_1

在第一轮部署中(见上图),面条将使用用户定义的命令检查服务器上的CPU使用情况。

server 1上cpu使用率很高,因为还有其他一些程序在运行,所以noodles使用scp上载代码code1code 2,并分别在server2server 3上运行它们。

至于如何上传代码,这只是我们写的一个命令列表,面条只是跟着命令走。

deployment_round_2

在第二轮部署(见上图)中,我们告诉面条检查所有服务器上的实验结果。

noodles发现server 3刚刚运行完code 2,所以它下载了实验结果,并按照我们的要求在本地机器上处理数据。

deployment_round_3

在第三轮部署中(见上图),仍然需要部署code 3code 4。Noodles再次检查所有服务器上的CPU使用情况。由于server 1现在刚刚免费,所以面条可以将code 3code 4分别部署到server1server3中。

部署回合将继续,直到所有实验都成功部署。在本例中,noodles将尝试在以后的回合中下载并处理code 1code 3code 4的实验结果。

面条的工作原理

一般步骤如下:

  1. 初始化e中的实验列表
  2. 对于每轮部署:
    1. 初始化s中的服务器列表
    2. 对于e中的每个实验:
      1. 面条在s中的每台服务器上运行用户定义的需求
      2. Noodles将度量(上述步骤的结果)与用户定义的表达式进行比较
      3. 如果表达式满足:
        1. 面条在满意的服务器上运行用户定义的命令
        2. e中删除当前实验
        3. s中删除满意的服务器
        4. 如果s为空,则中断
    3. 如果e为空,则中断

面条的实现遵循以下规则:

  1. 简单(用户无需查看文档即可理解代码和规范)
  2. 易于调试(发生不同错误时,面条可以采取不同的操作)
  3. 无状态(面条唯一关心的是部署是否成功,实验的状态必须由用户处理)

文档

请参阅完整文档here

先决条件

  1. 基于linux的终端(对于windows,我建议使用git-sdk
  2. python 3.5或更高版本

安装

运行以下命令:

pip install training-noodles

用法

noodles <command_type> <path_to_spec>

就这么简单。

示例

下面是一些例子面条的使用方法:

noodles run my_training.yml
noodles status my_training.yml
noodles monitor my_training.yml
noodles stop my_training.yml
noodles download my_training.yml
noodles upload my_training.yml
...

您也只能选择一些实验:

noodles run "my_training.yml:Experiment 1,Experiment 2"

请参阅示例Two Locals开始。有关更复杂的示例,请参见Train TensorFlow Examples

默认规格

如果用户规范没有指定,面条将使用默认规范中的属性。有关默认规范,请参见training_noodles/specs/defaults.yml

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

推荐PyPI第三方库


热门话题
java读取SSLSocket的最快或最佳方式   JavaGuice向类构造函数注入对象   java类不是抽象的,并且不会覆盖OnClickListener中的抽象方法onClick(视图)   java OpenGL 1.1更改颜色更改以前的颜色?   c#将Java/Android连接到。网络服务   java在节点上生成AES密钥   java Liferay与MarkLogic XDBC数据库集成   java使用静态初始化块来提高性能   java如何在需要不同参数的另一个方法中使用同一类中的方法   音频Java多种声音   Java显式引用转换   java Intellij,如何在maven项目中导入模块   java在什么条件下调用ELResolver的setValue方法?   java在beanshell中计算代码字符串并获取beanshell解释器返回的值   javascript将音频文件上载到服务器并从服务器响应设置图像   编码风格清理java代码,多个else if语句   java是否需要使此变量可变?   java线程未更新GlassPane上的进度条   java关闭调试模式@Vaadin Spring启动应用程序