我正在开发一个应用程序,允许用户提交他们的Python脚本。这些Python脚本将包含语言模型(LM),应用程序将使用这些语言模型来计算某些指标。
出于可扩展性和安全性的考虑,我计划在Docker容器中运行这些脚本。它们将充当“黑盒”,可以接受输入并返回输出,而应用程序不需要知道容器中发生了什么。
现在,我只需要进行概念验证,我假设Docker不仅允许用户手动创建容器,还允许自动创建容器。经过几个小时的搜索,我相信我错了。我读过关于Kubernetes的文章,但我不确定这是否是我需要的。
所以我的问题很简单:是否可以只使用Docker来实现这一点,或者我需要学习其他工具,如Kubernetes来实现这一点?
附加上下文
我曾经考虑过(只是为了概念验证)使用一个python程序来调用提交的代码,但我不知道它如何从提交的代码的导入中安装必要的包。我也不知道如何保持代码运行,因为LM需要保持加载才能运行,如果script1.pyscript2.py,它将不会一直执行到script 2。py已经完成运行,这意味着每次需要调用LM函数时,我都必须等待LM加载。此外,我已经有了一个docker-compose.yml文件,它会自动安装所有依赖项并容器化提交的python脚本,但它必须手动运行。
如果你想看看容器化的一些代码:
这将创建一个包含脚本的容器,该脚本充当LM和服务器之间的中间人,并自动安装LM所需的依赖项。
FROM python:3.9
WORKDIR /usr/app/src
COPY communicator.py ./
COPY lm_submission.py ./
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
这个docker-compose文件手动创建“服务器”(为LM提供输入并等待输出的东西)和通信器(理论上,会有很多通信器运行多个LM和一个服务器。此外,chatGPT_roberta_model
参数将是一个变量名,根据正在运行的LM的名称而变化)。
version: '3.9'
services:
communicator:
build: .
command: sh -c "sleep 2s; python3 ./communicator.py chatGPT_roberta_model"
environment:
LISTEN_HOST: server
LISTEN_PORT: 5555
ports:
- '5556:5555'
depends_on:
- server
server:
build: ./server/
command: sh -c "python3 ./server.py"
environment:
SEND_HOST: server
SEND_PORT: 5555
ports:
- '5555:5555'
1条答案
按热度按时间yhuiod9q1#
如果使用正确的工具,准备POC所需的时间相对较少。
我建议你开始探索minikube,它是Kubernetes的精简版和便携版,非常适合这种类型的用例。
看看这里:https://minikube.sigs.k8s.io/docs/start/
显然,这些公司有云提供商或大型Kubernetes测试集群可用于这些需求;minikube更像是实验室的东西。
(我之所以提到Kubernetes,是因为作为一个容器编排器,它肯定是最好的选择,并且最接近可能的生产用例)
然后了解Kubernetes Deployment和Service资源,以释放您的“黑盒”应用程序。Deployment将允许您释放1个或多个Pod(应用程序+操作系统+网络的示例),Service将允许您在K8s集群内部和/或外部访问应用程序。
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
https://kubernetes.io/docs/concepts/services-networking/service/
这样就可以确保这些应用程序示例(Pod)保持启动和运行,并始终可供最终用户使用,只需遵循几个简单的步骤--〉Multi container pod with command sleep k8
最后,我建议不要创建有活跃root用户的容器(如果可能的话),并防止用户通过SSH访问这些Pod;当然,更好的解决方案可能是开发前端。
PS:如果你不知道如何生成Kubernetes清单,你可以简单地转换Docker Compose清单--〉https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/