我一直在评估AWS圣贤使用TensorFlow,并将其集成到我们的Python-heavy-ML堆栈中,以提供模型训练步骤。这样做的目的是避免购买GPU服务器来训练和部署模型,并利用位于同一位置的S3存储桶进行训练和数据存储。以下是我们过去一个季度的经验总结。

我想先说SageMaker是5个月前发布的。它处于生命周期的早期,我们期望它能继续快速改进。我们仍在计划使用SageMaker并围绕它构建我们的ML基础设施,尽管存在以下所有问题。很多问题都很小,或者很容易解决。

根据他们的文档,下面的一些陷阱可能不是非常明显,有些是合法的bug,其中许多正在考虑之中。但是,对于任何考虑使用SageMaker的人,请注意我们遇到的问题:

性能

开始一项培训工作和一个终点大约需要5-6分钟。从Sagemaker上训练的模型中获得预测的唯一方法是下载并在本地重新创建它,或者启动端点(这是一个TF服务实例afaict)。我尽量不让端点保持运行,因为它们要花钱(即使您没有针对它们进行预测),而且即使它们的管理成本很低,也比我希望的要高一些。

它们并不是保持Tensorflow最新的最佳方法——目前可以使用1.6。您总是可以在您的应用程序中指定较新的版本要求.txt,但这会增加启动时间。

不便之处

当您创建一个TensorFlow培训作业时,您的想法是为Sagemaker提供定义tf.估计量(即a型号\u fn,列车输入等等),然后它就开始用你提供的args进行训练。如果有依赖项,可以在要求.txt(如果可能)或将其包括在源目录已经涂上焦油送过去了。一个关于列车输入:SageMaker似乎期望列车输入成为()->(特征、目标),而tf.估计量构造函数只需要tf.估计器.输入.numpy\u输入\u fn. 如果您想有一种方法来测试这些函数,而不必点击SageMaker,那么这就有点烦人了。

他们的张力板包装(即设置运行\u tensorboard \u locally=True适合电话)是非常糟糕的。我建议您自己运行Tensorboard,并将它指向存储检查点的S3存储桶(默认情况下,它可以这样做,只给它URI),但是Tensorboard在这方面有点慢——而且您不知道什么时候加载了新的摘要(这不是Amazon的错)。

他们的'本地'模式工作得很好,一旦你有了码头设置,但它不清楚如何做到这一点。结果发现它藏在一些某处的例子. 一旦这些都解决了,你就可以指定实例类型=“本地”.

对于像我这样的沮丧的实践者来说,他们只想知道TF容器到底在做什么:如果你有本地模式容器,你可以从容器中提取代码/usr/local/lib/python2.7/dist-packages/tf\u容器. 不客气。

不过,在培训之后,它确实会留下不可清理的root拥有的文件。这并不像人们想象的那样理想。另外,除非您指定,否则它会将所有内容存储在/tmp中'local':{'container\u root':'/not/tmp'}在里面~/.sagemaker公司/配置yaml.

关于AWS,我最喜欢的事情之一是它的详细权限系统。而且,这是最烦人的事情之一,在SageMaker里也不容易。

他们的pythonsdk在某些地方是非常不完整的。比如,你不能通过它删除一个模型,你必须抓住你的博托3然后通过它直接调用API。

漏洞

不要将tensorflow服务api更新到1.7版本。它打破这个sagemaker python sdk.

你知道那件事吗要求.txt? 不。对不起的。文件里已经有一个月了。似乎不行任何东西¯_(ツ)_/¯.

局限性

最终,无法“扩展”Tensorflow容器并将其与Tensorflow SDK一起使用(afaict),因为它将调用默认的Tensorflow映像。你当然可以写你自己的SageMaker容器,但那需要更多的工作。。。

显然,发送给SageMaker开始培训工作的超参数有一个很小的大小限制(256个字符)。我觉得有点疯狂,但我们到了。与美国焊接学会合作解决这个问题。

没有VPC对培训工作的支持。这对我们来说意味着,我们不能让培训工作从我们的数据库中提取数据,因为我们需要设置专有网络对才能这样做。相反,我现在有一个任务,在别处提取和处理数据,然后将其上传到相应的S3存储桶。根据AWS支持,修复方法是将超参数存储在一个通道中,就像存储模型初始化内容一样。这很尴尬,但很有效。

通过培训/评估挂钩基本上是不可能的,因为您需要序列化发送的任何内容。你可以把它们放进冰箱里估算器规范那是你的型号\u fn返回,但既然那叫做。。。每次你恢复检查点时,如果你需要钩子来保持状态,它会很快变得非常笨拙。

什么工作

只要提供创建模型所需的信息,就可以很容易地从SDK中建立端点。

GPU训练很简单——只要告诉它使用一个GPU实例。但是,您必须增加服务限制才能使用多个。

分布式训练也很简单:只需告诉它使用更多的实例!

其他注意事项

它似乎在每次运行的基础上将tar的源dir存储在一个S3 bucket中,我从来没有告诉过它要使用这个bucket(并且一直告诉我它在运行时正在创建这个bucket)。实际上,看看代码,这是一个非常小的bug:在某些情况下,它只是要求使用默认的bucket,而不是使用提供的bucket。

这个tf.估计量框架训练和评估(不是真正地SageMaker的问题,但这就是他们在TF容器中使用的(从1.6开始)在我看来使用起来很尴尬,并且有一些大的漏洞(比如提前停止是不可能的)。

这个自述文件.txtsagemaker python sdkrepo是比类似的更好的文档,SageMaker的实际AWS文档。我会先去的。

最后一件事——我发现支持渠道的响应顺序是:

  1. 我们的实际客户支持线。
  2. 针对他们的SDK的Github回购提交问题。
  3. SageMaker开发者论坛。别为这个费心。

希望这有助于任何人在那里开始做他们的ML训练!