我一直在评估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开始)在我看来使用起来很尴尬,并且有一些大的漏洞(比如提前停止是不可能的)。
这个自述文件.txt
上sagemaker python sdk
repo是比类似的更好的文档,SageMaker的实际AWS文档。我会先去的。
最后一件事——我发现支持渠道的响应顺序是:
- 我们的实际客户支持线。
- 针对他们的SDK的Github回购提交问题。
- SageMaker开发者论坛。别为这个费心。
希望这有助于任何人在那里开始做他们的ML训练云!