我们不在笔记本电脑上运行生产服务:我们需要特殊的服务器来实现。
在这篇文章中,我们将介绍一种可能的选择。亚马逊网络服务,简称AWS。我们决定选择AWS,因为它很受欢迎,我们与亚马逊和AWS都没有关系。
其他流行的公共云也存在,包括谷歌云、微软Azure和数字海洋。我们在本文中不涉及它们,但你应该能够在网上找到类似的说明,并将一个模型部署到你最喜欢的云供应商。
要遵循本节的说明,你需要有一个AWS账户。
AWS Elastic Beanstalk
AWS提供了很多服务,在那里部署网络服务有很多可能的方式。例如,你可以租用一台EC2机器(AWS中的服务器)并在上面手动设置服务,使用AWS Lambda的 "无服务器 "方法,或者使用一系列其他服务。
在这篇文章中,我们将使用AWS Elastic Beanstalk,这是将模型部署到AWS的最简单的方法之一。此外,我们的服务足够简单,使得我们有可能保持在免费层的限制之内。我们可以在第一年免费使用它。
Elastic Beanstalk自动处理了许多我们在生产中通常需要的事情,包括:
- 将我们的服务部署到EC2实例上
- 扩大规模:在高峰期增加更多的实例来处理负载
- 缩小规模:当负载消失时,移除这些实例
- 在服务因任何原因崩溃时重新启动服务
- 平衡实例之间的负载
我们还需要一个特殊的工具--Elastic Beanstalk命令行接口(CLI)--来使用Elastic Beanstalk。CLI是用Python编写的,我们可以像其他Python工具一样,用pip安装它。
因为我们使用Pipenv,所以我们可以把它作为一个开发依赖项来添加:这样的话,我们只为我们的项目安装,而不是在整个系统中。
pipenv install awsebcli --dev
注意:开发依赖项是我们用于开发应用程序的工具和库。通常,我们只在本地需要它们,在部署到生产的包中不需要它们。
安装后,我们可以进入我们项目的虚拟环境:
pipenv shell
现在CLI应该是可用的。让我们检查一下:
eb --version
它应该打印出版本:
EB CLI 3.18.0 (Python 3.7.7)
接下来,我们运行初始化命令:
eb init -p docker churn-serving
注意,我们使用"-p docker":这样,我们指定这是一个基于Docker的项目。
如果一切正常,它会创建几个文件,包括.elasticbeanstalk 文件夹中的config.yml 文件。
现在我们可以通过使用local run 命令在本地测试我们的应用程序:
eb local run --port 9696
这应该与上一节中使用Docker的方式相同:它将首先构建一个镜像,然后运行容器。
为了测试它,我们可以使用与之前相同的代码,得到相同的答案:
{'churn': False, 'churn_probability': 0.061875678218396776}
在验证了本地运行良好之后,我们就可以把它部署到AWS了。我们可以用一条命令来完成:
eb create churn-serving-env
这个简单的命令负责设置我们需要的一切:从EC2实例到自动扩展规则:
Creating application version archive "app-200418_120347".
Uploading churn-serving/app-200418_120347.zip to S3. This may take a while.
Upload Complete.
Environment details for: churn-serving-env
Application name: churn-serving
Region: us-west-2
Deployed Version: app-200418_120347
Environment ID: e-3xkqdzdjbq
Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Docker running on 64bit Amazon Linux 2/3.0.0
Tier: WebServer-Standard-1.0
CNAME: UNKNOWN
Updated: 2020-04-18 10:03:52.276000+00:00
Printing Status:
2020-04-18 10:03:51 INFO createEnvironment is starting.
-- Events -- (safe to Ctrl+C)
创建一切需要几分钟时间。我们可以监控这个过程,在终端看到它在做什么。
当它准备好时,我们应该看到以下信息:
2020-04-18 10:06:53 INFO Application available at churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com.
2020-04-18 10:06:53 INFO Successfully launched environment: churn-serving-env
日志中的URL(churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com)很重要:这就是我们如何到达我们的应用程序。现在我们可以使用这个URL来进行预测(图1)。

图1.我们的服务被部署在AWS Elastic Beanstalk的一个容器内。为了到达它,我们使用它的公共URL。
让我们来测试一下:
host = 'churn-serving-env.5w9pp7bkmj.us-west-2.elasticbeanstalk.com'
url = 'http://%s/predict' % host
response = requests.post(url, json=customer)
result = response.json()
result
和之前一样,我们应该看到相同的响应:
{'churn': False, 'churn_probability': 0.05960590758316393}
这就是全部!我们有一个正在运行的服务:
警告:这是一个玩具的例子,我们创建的服务可以被世界上的任何人访问。如果你在一个组织内部这样做,应该尽可能地限制访问。将这个例子扩展为安全的并不困难,但这不在本文的讨论范围之内。在工作中做这件事之前,请咨询你公司的安全部门。
我们可以在终端使用CLI做一切事情,但也可以从AWS控制台管理。要做到这一点,我们在那里找到 "Elastic Beanstalk "并选择我们创建的环境(图2)。

图2.我们可以在AWS控制台中管理Elastic Beanstalk环境
要关闭它,在 "环境行动 "菜单中选择 "终止部署",使用AWS控制台。
警告: 尽管Elastic Beanstalk有自由层资格,但我们还是要小心,一旦不再需要它,就立即将其关闭。
或者,我们使用CLI来做:
eb terminate churn-serving-env
几分钟后,部署就会从AWS中删除--而且不再能访问该URL。
AWS Elastic Beanstalk是一个伟大的工具,可以开始为机器学习模型提供服务。你可以找到更高级的方法,这涉及到像AWS ECS或Kubernetes这样的容器编排系统;或者使用AWS Lambda的 "无服务器"。
这个系列就到此为止。