机器学习算法自动训练工具Parris,消除你重复建堆栈的烦恼

本文由 【AI前线】原创,推荐阅读:t.cn/RHNgd73

作者|Joseph Greene

编辑|Emily

AI 前线导读:“近日,有人嫌一遍又一遍地建立堆栈太麻烦,于是在 Reddit 上推出了一个开源工具 Parris,它能够帮助开发人员自动训练机器学习算法。留言中很多人盛赞这个工具帮助他们省去了耗费在与机器学习主要目标无关的繁琐工作上的时间。开源的贡献者也表示,这个工具能够帮助开发者不必将时间耗费在架构分配和设置、数据收集、数据清理 / 标签,和文档记录等事务上。”

此工具的最大意义——节省成本

那么,这个工具可以对新入门 AI 的小伙伴有什么帮助呢?此开源工具的贡献者在 Reddit 留言中对这一问题做了详尽的回答:

长话短说,这个工具可以让您利用云资源(目前的版本只使用 AWS,但是未来的版本中将加入 GCP 、Azure 等),并且减少时间成本。考虑到我们在机器学习相关的工作上把太多的时间浪费在与算法无关的事情上,比如架构分配和设置、数据收集、数据清理和标记,日志记录等,我们创建了这个工具,只需点击按钮即可以开始训练算法的全过程。

详细来说,当您入门机器学习算法时,第一件引起您注意的事,将是您究竟花费了多长时间来完成算法的运行。在运行监督式学习算法时,我们至少需要一个经过整理的标签数据集、训练数据集的算法、运行训练的架构(可能需要数小时、数天,甚至数周,取决于具体工作),以及包括安装操作系统、GPU 驱动程序,和项目相关基础框架的设置。Parris 工具使用的是在 AWS 账户中的 CloudFormation 模板,因此我们仅需按下按钮,或运行一个 CLI 命令即可启动训练,包括所有服务器设置和相关项安装,并在完成训练之后自动终止。此外,还可以设置服务器自动停止的时间,无论训练是否完成。

另外,实际运行训练(工作中计算量最大的部分)花费的时间很大程度上取决于硬件设备(假设您的代码已经做过优化并可高效运行)。使用 GPU 时,许多实践者(无论是学生、业余爱好者还是专业人员)要么必须购买 NVIDIA Titan V 用来存储数据,要么只在 CPU 上进行训练。当然,这不是个二选一的问题,因为云就是为了这个目的而存在的。这种情况下,云服务提供商的计算能力可以很好地解决这个问题,只需要花钱买下服务时间,就可以获得满足需求的虚拟化服务器配置。当然,这并不是完美的解决方案,例如,GPU 支持的 AWS 云服务价格相当昂贵,p3.2xlarge 的服务每月的价格就在 2000 美元以上。当然,市面上也有一些较便宜的服务器(例如,不需要 GPU 时,我有时会使用 c5.4xlarge,这样成本会控制在每月 497 美元)。但这仅是云提供商的问题,在项目启动之前,您还需要未雨绸缪,了解所有需要的东西。

尽管使用云资源意味着您不需要为您的项目架设一个服务器,但设置仍然是一件让人头疼的事。这就是这个工具发挥作用的地方:它可以自动启动服务器,安装需要的相关项,加载算法和训练集,运行训练,并在完成时自动终止。由于训练脚本本身和训练配置文件取决于个人的工作需求,所以还需要做大量的工作才能启动训练。但是,如果您已经有了训练算法的脚本,那恭喜您,使用这个工具之前所需要做的大部分工作已经完成了,而您只需要将它输入,作为 trainer-script.sh 文件的一部分。

如果您是刚入门的新手,只有在完成第一个项目之后,此工具才会对您有所帮助,因为您无法在没有进行过任何训练的情况下使用这个工具。算法和数据集准备就绪后,入门指南会告诉您下一步怎么做。

请注意,我在示例中引用了一些昂贵的云服务费用数据,但实际上我并没有经常使用这些服务,这些成本意在于建立大家“在最坏的情况下”服务成本的意识,以提醒大家忘记关闭服务会导致什么样的后果。

入门指南:

什么是 Parris?

Parris 是一个机器学习算法训练工具,具有以下功能:

  • 创建 Lambda 函数
  • 在调用 Lambda 函数时启动 CloudFormation 堆栈
  • 首次启动训练时,在堆栈的 EC2 实例运行 UserData 脚本
  • 完成后停止 EC2 实例。

目的:

此工具的主要目的是减少训练机器学习算法时重复设置的次数,可以更有效地利用服务器的计算时间,以节省成本(服务器一旦启动即开始训练,完成时自动停止)。

下面简单介绍一下使用 Parris 之前需要做的事:

您需要一个准备好,带有数据集的机器学习算法,和一个启动训练所需的 Bash 脚本。

0:准备好 Configs

在设置完成之后,您主要要做的事是编辑 traing-config.json 配置文件,以及实际运行训练的 trainer-script.sh 脚本。由于是第一次设置,您需要设置 Lambda-config.json 配置文件。(这应该不难,因为只有两行,其中一行是可选的。)

我在示例中使用的是我在 Github 上的一个存储库来进行基本训练,可以让您对其有一个简单的了解。除了像 IAM role ARN 值和 S3 存储名称这样的具体事项之外,其他的无需更改。

训练配置:

  • 将您的子网 ID 更改为您的其中一个子网的 ID。(请确保您已经为 AWS 账户设置了 VPC、子网、安全组和 EC2 密钥对。如果是第一次使用 AWS,您的账户中应该有一些可用的默认资源。)
  • 将您的安全组标识更改为 VPC 中的安全组。
  • 将您的 ec2-keypair-name 更改为自己的 EC2 密钥对。
  • 将您的实例类型更改为 t2.micro 或另一种小型实例类型。

lambda-config.json:

  • 将 lambda-role-arn 更新为自己的 IAM role ARN 值。(如果不知道这是什么,请查看“Lambda IAM role 指南”,以下是一个可以使用的示例。

在设置 IAM role 时,您需要将一个 policy(或多个 policy)添加到 role,以定义 Lambda 函数可以访问的所有内容。我使用以下示例,让 Lambda 函数可以启动新的 CloudFormation 堆栈,从 S3 存储中获取对象:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack",
                "cloudformation:ValidateTemplate",
                "ec2:DetachVolume",
                "ec2:AttachVolume",
                "ec2:ModifyVolume",
                "ec2:ModifyVolumeAttribute",
                "ec2:DescribeInstances",
                "ec2:TerminateInstances",
                "ec2:DescribeTags",
                "ec2:CreateTags",
                "ec2:DescribeVolumesModifications",
                "ec2:RunInstances",
                "ec2:StopInstances",
                "ec2:DescribeVolumeAttribute",
                "ec2:CreateVolume",
                "ec2:DeleteVolume",
                "ec2:DescribeVolumeStatus",
                "ec2:StartInstances",
                "ec2:DescribeVolumes",
                "ec2:ModifyInstanceAttribute",
                "ec2:DescribeInstanceStatus",
                "s3:GetObject"
            ],
            "Resource": "*"
        }
    ]
}

我强烈推荐(不是必须)制定一个允许 Lambda 写入 CloudWatch 日志的 policy,因为它可以让您在 Lambda 函数出现问题时读取日志,以了解发生的故障。以下是我在一个 policy 中的所有 CloudWatch 写入权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:DeleteSubscriptionFilter",
                "logs:DeleteLogStream",
                "logs:CreateExportTask",
                "logs:DeleteResourcePolicy",
                "logs:CreateLogStream",
                "logs:DeleteMetricFilter",
                "logs:TagLogGroup",
                "logs:CancelExportTask",
                "logs:DeleteRetentionPolicy",
                "logs:GetLogEvents",
                "logs:AssociateKmsKey",
                "logs:FilterLogEvents",
                "logs:PutDestination",
                "logs:DisassociateKmsKey",
                "logs:UntagLogGroup",
                "logs:DeleteLogGroup",
                "logs:PutDestinationPolicy",
                "logs:TestMetricFilter",
                "logs:DeleteDestination",
                "logs:PutLogEvents",
                "logs:CreateLogGroup",
                "logs:PutMetricFilter",
                "logs:PutResourcePolicy",
                "logs:PutSubscriptionFilter",
                "logs:PutRetentionPolicy"
            ],
            "Resource": "*"
        }
    ]
}

最后,我们需要建立 trainer-script.sh,并开始运行训练。这部分最好全部由自己编写,因为各自算法的依赖性和推导出训练结果的方法总是不尽相同的。

trainer-script.sh:

滚动到编辑区,在该行下方添加完整的训练脚本。请记住,由于训练脚本是在新的服务器上启动,因此在启动训练工作之前,需要完成所有依赖关系、目录结构等设置。

这些完成之后,就差不多可以使用这个工具了!如果您在 lambda-config.json 中没有使用 s3-training-bucket 值,请继续下一步。如果您使用 S3 存储来加载您的配置,则需要将以下文件加载到您的 S3 存储中,结果如下(如无子目录或不同文件名):

+---your-s3-bucket
|   \---trainer-script.sh
|   \---training-config.json
|   \---lambda-config.json

然后进入下一步。

准备好 Lambda 函数

在训练开始之前,需要 Lambda 配置来启动这个过程。在此步骤中,您需要创建一个 AWS Lambda 函数,用于同一算法的多次训练或多个不同算法的训练。

  • 在 Parris 软件包的根目录下,激活您的 virtualenv。
  • 使用 $ python setup.py 创建 Lambda 函数。
  • 如果您已经有 Lambda 函数,将更新代码包。
  • 如果一切顺利,日志将出现一个 ARN 值进行确认。

启动第一次训练

  1. 打开 AWS 控制台并进入到您的 Lambda 函数。
  2. 点击页面顶部的“测试”按钮,手动调用该功能。如果没有配置测试,您需要:
  • 在“测试”按钮旁边的“保存的测试事件”下拉列表中,单击“配置测试事件”,创建一个新的测试事件。
  • 由于 Lambda 函数只有一个活动(当它被调用时启动一个新的 CloudFormation 堆栈),我们不需要传递任何参数。
  • 使用事件名称 Parris-Test-Event 和{}创建一个测试。点击保存。
  • 在关闭创建对话框后,点击下拉菜单中的新测试事件测试,并观测更新执行结果。

函数运行时,会得出“成功”的执行结果,并输出{}。

切换到 AWS 控制台的 CloudFormation 视图,观察新的 CloudFormation 堆栈启动。这个步骤应该只需要一两分钟,但取决于启动 instance 的类型。

切换到 AWS 控制台的 EC2 实例视图,查看最新结果。很快地,训练工作将开始启动。

得到训练结果

训练结果很大程度上取决于我们如何设置保存结果参数的算法。在大多数情况下,这些结果将被保存到本地目录(即服务器上的某个地方,可能与正在进行训练的位置相同)。但是,训练结束后,我们希望将这些内容导出到可以更长久保存的位置。

终止 CloudFormation Stack

现在,您已经成功创建了 CloudFormation 堆栈,并确认其可以按预期运行。我们可以安全地终止这个过程以节省成本。

  1. 打开 AWS 控制台并进入 CloudFormation 视图。
  2. 从列表中选择您启动创建的 CloudFormation 堆栈。
  3. 点击页面顶部的操作下拉菜单,点击删除堆栈。
  4. 观察堆栈的事件选项卡(页面底部)跟踪其进度,刷新页面添加新事件。
  5. 结束时,这个堆栈将从列表中消失。
  6. 更新 Lanbda 函数
  7. 更新训练 Stack
  8. 在 AWS 之外的设备上启动训练

设置:

您需要一个 AWS 账户,一个 AWS 证书(通过 $ aws configure 进行设置),一个接受训练的机器学习算法,当然还要有一个可以训练的数据集。您可能还需要一个 S3 存储器或其他存储位置来存储算法的训练结果。

UNIX/ Linux:

$ git clone https://github.com/jgreenemi/parris.git && cd parris
$ virtualenv -p python3 env
$ source env/bin/activate
(env) $ pip --version
pip 9.0.1 from .../env/lib/python3.6/site-packages (python 3.6)
(env) $ pip install -r requirements.txt

Windows:

$ git clone https://github.com/jgreenemi/parris.git && cd parris
$ virtualenv -p python3.exe env
$ env\Scripts\activate
(env) $ pip --version
pip 9.0.1 from ...\python\python36\lib\site-packages (python 3.6)
(env) $ pip install -r requirements.txt

如何使用?

按照“入门指南”中的说明进行设置,为进一步了解该工具,还可以查阅“配置指南”,配合“入门指南”使用。

常见问题

请参阅文档中的常见问题解答页面。

贡献者

此工具是在 Apache 2.0 许可下发布的开源项目。

联系方式

Joseph Greene, jgreenemi@gmail.com

关注后回复「AI」你懂的

相关推荐