基于 SSH 隧道的机器学习模型服务分布式部署实践
基于 SSH 隧道的机器学习模型服务分布式部署实践
动机
第一集:收到需求
25年四月接到了来自其他专业朋友的需求:能不能开发一个小程序把他现有的机器学习模型封装去参加创新创业类比赛。
第二集:爽开发
点击这里访问项目仓库,把机器学习项目封装成小程序后端其实不难,用flask封装成一个API可以轻松接入Restful架构项目
第三集:你的小程序能不能给我用用
万恶之源,我之前一直是做一般的spingboot+vue3前后端分离项目,而我的阿里云穷鬼服务器面对这种要GPU预测的任务显然无能为力了。
这里特写一篇小作文记录一下我是怎么一步步开发一个满足需求的小程序并且最终让小程序上线到别人能直接使用
虚拟局域网
场景
本地开发环境下 windows+windows
你是一名全栈工程师,但是你只有一台集成显卡的电脑,为了跑机器学习任务你需要去向别人借电脑。
但是你的朋友不可能一直让你用他的电脑,你可以在他的电脑上偷偷挂一个flask线程,这样就不影响他继续玩游戏了。
现在只需要在本地上开发然后用http调他电脑上的api就行。
这个方法需要让机器学习flask后端监听的端口对局域网开放,不然会因为防火墙而调用失败
radmin LAN
玩 Minecraft 的人对这个软件肯定不陌生。
碰巧你的朋友和你之前一起玩mc使用radmin LAN联机,这时就可以直接利用radmin LAN创建虚拟局域网,然后请求对方ip

比较可惜的是这个只兼容windows
Tailscale
如果你和你的朋友关系很好,你也可以麻烦他在他的电脑上下一个Tailscale,之后创建账号就能在设备列表查看对方虚拟局域网ip了
这个最大的优势是多端兼容,可以支持电脑和移动端设备的虚拟局域网,光看设置界面就知道它的好用程度,个人当玩具用免费套餐足够。

内网穿透
windows PC搭建公网服务器
场景
你的小程序还没有上线,但是你的朋友看你给他发的界面截图给出了灵魂拷问:“我能不能在手机上用用”
起初,你想着让他用开发者工具的测试功能先体验一下,而不是着急上线。但是问题来了,这样的话对方就需要从手机上访问你的服务器后端。
樱花内网穿透
怎么又是 Minecraft 老朋友,内网穿透软件很多,这里再列举两个:ngrok、花生壳。由于我樱花用的比较多这里就以樱花为例。
值得注意的是,请不要把樱花的监听窗口直接放到后端服务的监听端口上,请使用nginx把请求转发到对应端口,再在樱花上监听http端口。

具体的nginx.conf如何配置这里不多赘述,这里仅讨论网络问题。
Tailscale
写重了?并不是。
在朋友的手机上下载Tailscale移动端(ios需要外区id),然后把前端请求的baseurl改成自己的公网ip,这样也可以实现请求,但是这样并没有真的把后端放到公网,只是相当于把朋友手机纳入了白名单。
ssh通道
都有ssh权限了为什么不直接借助ssh?
场景
你的后端代码已经上线云服务器了,显然小程序前端和后端的通讯已经不成问题,但是现在你肯定更希望不依赖第三方局域网软件来让flask与其他后端通信了。
反向SSH隧道
云服务器需要访问高性能服务器上的模型服务。
但是高性能服务器不能稳定提供公网 HTTP 服务,只能主动 SSH 或被 SSH 连接。
这种情况下,一般跑后端代码的 HTTP 云服务器的ssh连接比 GPU 服务器更稳定,所以一般情况下优先考虑反向SSH隧道,这种方案最大的好处是 HTTP 服务器不需要关心与子模块的连接,项目只需要维护好子模块即可。
在 GPU 服务器上运行
ssh -N -R 18000:127.0.0.1:8090 [REMOTE_NAME]
这样一来
HTTP服务器的 127.0.0.1:18000
|
| SSH 反向隧道
v
GPU服务器的 127.0.0.1:8000
于是HTTP服务器可以长期稳定地运行,只需要关心接口来自18000,与GPU服务器完全解耦。
主动SSH隧道
主动SSH隧道,即让需要调用接口的HTTP服务器去主动连接GPU服务器。
这种隧道的主要应用场景主要是考虑隐私,因为很多GPU高性能服务器是一个账号多个人用的,这时在GPU服务器上SSH可能会泄露隐私,尤其是不能免密ssh了,这个时候就可以考虑从HTTP服务器主动往GPU这边建立隧道。
ssh -fN -L 18000:127.0.0.1:8000 [REMOTE_NAME]
这里顺便解释一下SSH隧道的参数含义
- -N:不执行远程命令,只做端口转发
- -f:放到后台运行
- -L:本地端口转发
- -R: 反向隧道
通过ssh隧道的方式相当于利用ssh的操控能力实现了两机一用的分布式部署。
写在最后
我怎么把我玩 Minecraft 联机的方法全用上了……

机器学习项目需要GPU,一般部署在不适合做http服务器的高性能集群上。而一般的后端程序仅仅需要CPU,普通性能的云服务器即可。本文提供我在微服务与机器学习分布式部署的一些思路。
浙公网安备 33010602011771号