在 AWS EC2 实例上使用 Flask 部署您的深度学习模型
Amazon Elastic Compute Cloud (Amazon EC2) 是一种 Web 服务,可在云中提供安全、可调整大小的计算容量。它旨在使开发人员更容易进行 Web 规模的云计算。 AWS 免费套餐提供每月 750 小时的 Linux、RHEL、SLES t2.micro 或 t3.micro 实例和每月 750 小时的 Windows t2.micro 或 t3.micro 实例
Amazon Elastic Compute Cloud (Amazon EC2) 是一种 Web 服务,可在云中提供安全、可调整大小的计算容量。它旨在使开发人员更容易进行 Web 规模的云计算。 AWS 免费套餐提供每月 750 小时的 Linux、RHEL、SLES t2.micro 或 t3.micro 实例和每月 750 小时的 Windows t2.micro 或 t3.micro 实例。
任何人都可以注册并免费使用这些服务 12 个月。您的服务将在注册 24 小时后激活。
在此博客中,我演示了在 AWS EC2 实例上使用您的 Flask 应用程序部署训练有素的深度学习模型。
我从头开始逐步部署了一个训练有素的 TensorFlow Deep Learning Flask API,同时设置了所有必要的资源和包。
该模型基于 Transformer Neural Networks,并在 Google Colab GPU 运行时进行了训练。
所以让我们开始吧!
第 1 步:设置您的 AWS EC2 实例
[](https://res.cloudinary.com/practicaldev/image/fetch/s--34gYJLs---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/krjc4kwr1yrco25e8ml0.png)
在服务下拉菜单中,单击“计算”。这将打开另一个右侧面板,如上图所示。单击 EC2 选项。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--H3mJCtTQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/6h1o7s4ihy8qumgqjtnk.png)
您将看到所有 ec2 类型的实例都在运行。单击“启动实例”以启动新实例。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--mSUu_6ug--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/53ayhnzd1yz10bbo72kg.png)
选择你的 Ubuntu 机器,这里我选择了 Ubuntu Server 20.04 LTS, SSD Volume Type ,64-bit (x86)。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--D3ox_R2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/h31pxww8e6pz9vvsqmws.png)
选择您的实例类型为 t2.micro。显然,这是免费套餐的唯一选择。我们将根据我们的需要修改内存分区,并增加内部存储。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Ey59baqK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/s2tx98mg15955y8h2rmy.png)
“查看并启动”实例。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--AnfEJVoZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/kohpxbny9zzcafwnuk5r.png)
“创建新的密钥对”以使用 SSH 协议安全地远程连接到您的实例。命名它并将其下载到与您的 Flask 应用程序相同的文件夹中。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--fpSi8_12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/8loh9wix04lnqj5r4kd9.png)
您将看到您的实例启动并运行。您可以根据需要重命名它。我将其重命名为“test_deploy”。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--lHodVPuR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/6oaavdcv370wkl8tw2bm.png)
现在,我们将为我们的实例创建一个安全组。
安全组充当您的实例的虚拟防火墙,以控制入站和出站流量。在这里,在实例中,向右滚动,您将看到您的实例的当前默认安全组。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--NKhsI4Mt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/vuuzr99i4snoikggeqcw.png)
从左侧面板转到安全组,您会看到所有当前可用的安全组。
“创建安全组”。给它一个名字,一个描述,然后点击“添加规则”来添加你的入站规则。
在我的实例中,我将类型设置为“所有流量”以允许访问所有可用端口,并将源设置为“使用 IPv4 的任何地方”,这将无类 IP 设置为 0.0.0.0/0 以允许任何地址。您可以根据自己的要求以及要公开的端口进行设置。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--tpDzPd5m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/w817uro9ygpnzxx9p93d.png)
回到实例,
右键单击您的实例 → 安全 → 更改安全组。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--s-hhydJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/i38p3vxukmj0o7gd78nq.png)
单击搜索栏,您将看到您创建的安全组。单击您的安全组,单击“添加安全组”,最后单击“保存”。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--5CUgcL2C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/j2q20lveskvk4nzy4qcy.png)
同样,回到实例,您将看到您的安全组已应用于您的实例。
第二步:安装SSH远程连接所需的软件
我们不会在终端中输入每个命令,而是使用轻量级软件,如 PuTTY、PuTTYgen(用于 PEM 到 PPK 转换)和 WinSCP 来建立 SSH(安全外壳)远程控制。
下载链接:
PuTTYgen:https://the.earth.li/~sgtatham/putty/0.76/w64/puttygen.exe
腻子:https://the.earth.li/~sgtatham/putty/0.76/w64/putty.exe
WinSCP:https://winscp.net/download/WinSCP-5.19.5-Setup.exe
启动 puttygen.exe 并从您的目录加载 .pem 文件。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Pso81NjN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/pzpqrjxxthj5nbl2vddd.png)
[](https://res.cloudinary.com/practicaldev/image/fetch/s--E_P7lzvS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/cotmnb8tt1coylprs67.png)
为生成的 .ppk(putty 私钥)文件提供一个名称并将其保存在同一目录中。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--a5My4BEK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/r7y0agdbjgwiueu3i5wz.png)
现在,启动 WinSCP 建立 SSH 远程控制。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--6Vk0Dwf3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ysww6tob2izwec5t6y90.png)
复制您的实例的公共 IP 地址并将其粘贴到“主机名”字段中。单击“高级”选项,选择 SSH 下的身份验证并加载之前生成的 .ppk 文件。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--g9OW7mjT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/rlpbiafoj3piph635e7j.png)
[](https://res.cloudinary.com/practicaldev/image/fetch/s--xddAvrkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3htm6p3nebx9xqjim09o.png)
输入用户名“ubuntu”,点击保存,然后点击登录。
刚果!!现在您已成功远程控制您的 AWS EC2 实例。
左侧面板现在显示您的本地目录,右侧面板显示 ubuntu 远程目录。
只需将程序文件拖放到右侧面板即可传输程序文件。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--yipotLbB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/dlc4m76lgemm5fx7csnz.png)
现在,是时候启动远程机器的终端了。启动 putty.exe。
将您的实例公共 IP 粘贴到“主机名”字段中。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--FlJqZAvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/imx4qafsqksapnaslp2f.png)
转到左侧面板中的 SSH → Auth,然后再次加载 .ppk 文件。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--BV1TFLJF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/m4s0yayhjgfd9m5hp9ek.png)
单击左侧面板中的“会话”选项返回,输入会话名称,然后单击“保存”。
我输入的名称为“test_deploy”
[](https://res.cloudinary.com/practicaldev/image/fetch/s--JpNaQmB0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3554jl7vzgachn2colxz.png)
双击名称或单击“打开”启动终端。
以“免费”身份登录
[](https://res.cloudinary.com/practicaldev/image/fetch/s--WSx0MRhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ft2nqyxmh4ticav56ph1.png)
第三步:终端
查看根目录中存在的文件和目录
ls
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--7fykVpak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/pb6ih8ycyfnjpypupx4c.png)
实例中尚未安装任何依赖项。因此,我们将获得所有必要的更新,然后安装 python3。
sudo apt-get update && sudo apt-get install python3-pip
进入全屏模式 退出全屏模式
提示询问“您要继续吗? (Y/n)”,按“y”并继续。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--o88KeLQJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/r6x1wcckw85gch8v2r7c.png)
我准备了一个 requirements.txt 文件,其中包含我的应用程序所需的所有依赖项和包。
要安装它们,只需运行:
sudo pip3 install -r requirements.txt
进入全屏模式 退出全屏模式
在安装了各种库之后,我们可能没有足够的空间来存放那些繁重的深度学习模型或任何其他文件。
我们回到我们的 AWS 管理控制台,
单击实例附近的复选框→存储选项卡→单击卷ID
[](https://res.cloudinary.com/practicaldev/image/fetch/s--I15H8dNR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/yeplp3sbkcfw01wl4r2a.png)
右键单击音量→修改音量
[](https://res.cloudinary.com/practicaldev/image/fetch/s--mvpPn9Zz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/bm1w85cg53ck586k7qp2.png)
根据您的要求更改音量。在这里,我将其更改为 20GB,最大为 30GB。
点击“修改”。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--nbLCFTG2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ppl71u3j4x5tks0rlr0d.png)
恭喜!
但是等等,分区还没有扩展。让我们回到终端......
要检查卷是否有必须扩展的分区,请使用 lsblk 命令。
lsblk
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--qeuaGTEe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/308v62ojrxp8fwdgwglz.png)
在这里,请注意 dsk 空间为 20GB,但我们的实例仍在使用 8GB 分区。
检查空间使用情况:
df -h
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--_4z2VdAb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/56u68dp0y3wwn7z4vgan.png)
扩展分区:
sudo growpart /dev/xvda 1
进入全屏模式 退出全屏模式
使用 lsblk 再次检查
[](https://res.cloudinary.com/practicaldev/image/fetch/s--jOgsBBDX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ap5hbea29agpa2fcv9sb.png)
现在内存已成功增加!
我必须安装 Tensorflow,但“grpcio”包在 Tensorflow 的安装过程中引起了一些问题,所以我独立安装了“grpcio”。
首先更新pip3:
sudo pip3 install -U pip
进入全屏模式 退出全屏模式
安装 grpciou003du003d1.36.1
sudo pip3 install grpcio==1.36.1
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--77imMfcc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/z2pee0s670zg44c7rn82.png)
现在安装 TensorFlow:
sudo pip3 install tensorflow
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Y2J-mrPe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/w2ncb84oigk7114d7p12.png)
哦,废话!进程被杀!
可能的原因:由于硬盘空间较小,可能不得不禁用缓存。仍然?!!
感谢 StackOverflow!执行:
sudo pip3 install tensorflow --no-cache-dir
进入全屏模式 退出全屏模式
第 4 步:运行 Flask 应用程序
在您的应用程序中,按如下方式修改 app.run()。
if __name__=="__main__":
app.run(host='0.0.0.0', port=80)
进入全屏模式 退出全屏模式
这里,hostu003d'0.0.0.0' 表示,任何地址都可以,没有这样的规范。
而且,端口 u003d 80 (HTTP),一切正常,22 (SSH),443 (HTTPS)...
请记住我们在创建安全组时如何修改“所有流量”的入站规则。这就是它的工作原理!
运行您的应用程序:
sudo python3 app.py
进入全屏模式 退出全屏模式
现在,您拥有运行 API 的独立服务器
[](https://res.cloudinary.com/practicaldev/image/fetch/s--udyMeI6Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3ehnp41tzsx3qcqidwp0.png)
访问附加端口号的实例 IP:
例如:3.134.92.137:80
我的实例 IP
[](https://res.cloudinary.com/practicaldev/image/fetch/s--n6oLi0xQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/uzj9hu3y0uzhcdjto73g.png)
第四步:会话
现在,我们将实现终端多路复用,简而言之,即使在我们关闭终端后也能保持当前会话运行。
停止当前正在运行的应用程序:Ctrl+C
再次,执行:
tmux
sudo python3 app.py
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Wqdp2Riq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/n53k5cxxgacp1jkehz1u.png)
全部完成!关闭您的终端,让您的 PC 休息,并且仍然可以从任何设备、任何位置灵活地部署您部署的 Flask API。
请记住,这是用于测试/演示的开发服务器,而不是生产部署。你可以使用 gunicorn 来做同样的事情。 Gunicorn 是一个 Python WSGI HTTP 服务器,许多开发人员使用它来部署他们的 Python 应用程序。这个 WSGI(Web 服务器网关接口)是必要的,因为传统的 Web 服务器不了解如何运行 Python 应用程序。
要结束终端多路复用,请使用 PuTTY 返回您保存的机器。
跑:
tmux attach
进入全屏模式 退出全屏模式
一旦进入会话:
停止应用程序并运行:
tmux detach
进入全屏模式 退出全屏模式
终端复用已结束。现在您将无法在关闭当前会话后运行您的应用程序。
总结
赞!!部署在您的 AWS EC2 实例上的深度学习 Flask API!
这就是这篇冗长的博客的全部内容。
我希望你发现这个有见地!
欢迎提出意见、想法、改进和建议!
.
.
.
.
.
.
.
封面图片:https://www.google.co.in/url?sau003di&urlu003dhttps%3A%2F%2Fwww.brainvire.com%2Famazon-web-service%2F&psigu003dAOvVaw2xnyUGPMUMrb_mWlSXQzn5&ustu003d1639846510264000&sourceu003dimages&cdu003d vfe&vedu003d0CAsQjRxqFwoTCICUsamm6_QCFQAAAAAdAAAAABAV
更多推荐
所有评论(0)