我的工作的最终结果应该是一个Python函数,它将JSON对象作为唯一的输入并返回另一个JSON对象作为输出。为了使它更具体,我是一名数据科学家,我所说的功能来自数据,它提供了预测(换句话说,它是一种机器学习模型)。
所以,我的问题是如何将这个功能交付给将要将其纳入网络服务的“技术团队”。
目前我遇到的问题很少。首先,技术团队不一定在Python环境中工作。因此,他们不能只将我的功能“复制并粘贴”到他们的代码中。其次,我想确保我的功能在与我相同的环境中运行。例如,我可以想象我使用了一些技术团队没有的库,或者他们的版本与我使用的版本不同。
ADDED
作为一种可能的解决方案,我考虑以下内容。我启动一个Python进程,它监听套接字,接受传入的字符串,将它们转换为JSON,将JSON提供给“已发布”函数,并将输出JSON作为字符串返回。这个解决方案有缺点吗?换句话说,“发布”Python函数作为监听套接字的后台进程是一个好主意吗?
答案 0 :(得分:9)
使用套接字你有正确的想法,但有很多框架正在做你想要的。与hleggs一样,我建议您结帐Flask以构建微服务。这将让其他团队将HTTP请求中的JSON对象发布到您的烧瓶应用程序并返回JSON对象。不了解底层系统或所需的额外要求!
这是一个用JSON回复和回复的烧瓶应用的模板
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/', methods=['POST'])
def index():
json = request.json
return jsonify(your_function(json))
if __name__=='__main__':
app.run(host='0.0.0.0', port=5000)
修改:根据Peter Britain的建议直接嵌入我的代码
答案 1 :(得分:3)
我对您的问题的理解归结为:
我如何与团队的其他成员共享Python库,否则可能不会使用Python?
我如何确保我的代码及其依赖关系是接收团队的运行方式?
接收团队可以在任何地方轻松安装东西吗?
这是一个简单的问题,没有直截了当的答案......正如您刚才提到的,这可能会集成到某些Web服务中,但您不知道此服务的实际平台。
你也问:
作为一种可能的解决方案,我考虑以下内容。我启动一个Python进程,它监听套接字,接受传入的字符串,将它们转换为JSON,将JSON提供给"发布" function并将输出JSON作为字符串返回。这个解决方案有缺点吗?换句话说,"发布"是一个好主意。一个Python函数作为后台进程监听套接字?
在最简单的情况下,一般来说,我会说没有。启动网络服务器(如HTTP服务器(内置Python))非常简单。但是服务(即使有资格作为" micro")也意味着基础设施,意味着安全等等。
Etc等。部署后,我的经验简单"套接字服务器毕竟不是那么简单。
在大多数情况下,首先避免重新分发套接字服务会更简单。如果您愿意,此处提出的方法可以用于在稍后阶段以更简单的方式打包整个服务。
我建议的是一个简单的命令行界面,非常适合安装。
要考虑的最小限度事项是:
步骤1。最简单的共同点是提供一个命令行界面,该界面接受JSON文件的路径并在stdout上吐出JSON。 这将在Linux,Mac和Windows上运行。
此处的说明适用于Linux或Mac,需要对Windows稍作调整(仅适用于configure.sh
脚本)
最小的Python脚本可能是:
#!/usr/bin/env python
"""
Simple wrapper for calling a function accepting JSON and returning JSON.
Save to predictor.py and use this way::
python predictor.py sample.json
[
"a",
"b",
4
]
"""
from __future__ import absolute_import, print_function
import json
import sys
def predict(json_input):
"""
Return predictions as a JSON string based on the provided `json_input` JSON
string data.
"""
# this will error out immediately if the JSON is not valid
validated = json.loads(json_input)
# <....> your code there
with_predictions = validated
# return a pretty-printed JSON string
return json.dumps(with_predictions, indent=2)
def main():
"""
Print the JSON string results of a prediction, loading an input JSON file from a
file path provided as a command line argument.
"""
args = sys.argv[1:]
json_input = args[0]
with open(json_input) as inp:
print(predict(inp.read()))
if __name__ == '__main__':
main()
您可以通过将路径传递给JSON文件来处理最终的大型输入。
第2步。打包您的功能。在Python中,这是通过创建setup.py
脚本来实现的。这也负责安装Pypi的任何相关代码。这将确保您所依赖的库版本是您期望的版本。在这里,我添加了nltk
作为依赖项的示例。添加你的:这可能是scikit-learn
,pandas
,numpy
等。这个setup.py
也会自动创建一个bin/predict
脚本,它将成为你的主要命令行界面:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from __future__ import absolute_import, print_function
from setuptools import setup
from setuptools import find_packages
setup(
name='predictor',
version='1.0.0',
license='public domain',
description='Predict your life with JSON.',
packages=find_packages(),
# add all your direct requirements here
install_requires=['nltk >= 3.2, < 4.0'],
# add all your command line entry points here
entry_points={'console_scripts': ['predict = prediction.predictor:main']}
)
此外,正如Python常见的那样,为了简化设置代码,我创建了一个&#34; Python包&#34;目录移动此目录中的预测器。
第3步。您现在想要打包它们易于安装的东西。一个简单的configure.sh
脚本完成了这项工作。它会安装virtualenv
,pip
和setuptools
,然后在与项目相同的目录中创建virtualenv
,然后在那里安装预测工具(pip install .
是与python setup.py install
基本相同。使用此脚本,您可以确保将运行的代码是您希望使用正确的依赖项运行的代码。此外,您确保这是一个隔离的安装,对目标系统的依赖性和影响最小。这是使用Python 2测试的,但也应该在Python 3上很有用。
#!/bin/bash
#
# configure and installs predictor
#
ARCHIVE=15.0.3.tar.gz
mkdir -p tmp/
wget -O tmp/venv.tgz https://github.com/pypa/virtualenv/archive/$ARCHIVE
tar --strip-components=1 -xf tmp/venv.tgz -C tmp
/usr/bin/python tmp/virtualenv.py .
. bin/activate
pip install .
echo ""
echo "Predictor is now configured: run it with:"
echo " bin/predict <path to JSON file>"
最后,您将拥有一个完全配置,隔离且易于安装的代码,并具有简单易用的命令行界面。 您可以在这个小型仓库中看到它:https://github.com/pombredanne/predictor 您只需克隆或获取回购邮件的zip或tarball,然后通过自述文件进行操作即可。
请注意,对于更复杂的应用程序更具参与性的方式,包括销售依赖项以便于安装而不依赖于网络,您可以检查https://github.com/nexB/scancode-toolkit我也会这样做。
如果你真的想公开一个Web服务,你可以重用这个方法并用一个简单的Web服务器(比如Python标准库中的内置服务器或者瓶子或瓶子或者gunicorn)来包装它,并提供{{ 1}}安装它并生成命令行以启动它。
答案 2 :(得分:0)
您的任务(一般性地)是关于生成机器学习模型的,其中模型的消费者可能不在与用于开发模型的环境相同的环境中工作。自从过去几年以来,我一直在努力解决这个问题。许多公司面临着这个问题,并且由于数据科学家和开发人员之间的技能,目标以及环境(语言,运行时间)不匹配而使问题更加严重。根据我的经验,我们提供以下解决方案/选项,每种方案都有其独特的优势和缺点。
选项1 :使用Python中的任何轻量级工具(例如,Flask)将模型的预测部分构建为独立的Web服务。您应该尝试尽可能地分离模型开发/培训和预测部分。您开发的模型必须序列化为某种形式,以便Web服务器可以使用它。
请注意,使用Flask公开单个模型预测很简单。但是如果需要扩展这个Web服务器,使用正确的库配置它,对传入请求的身份验证都是非常重要的任务。只有当开发团队准备好帮助这些路线时,您才应该选择此路线。
如果模型经常更新,那么对模型文件进行版本控制将是一个不错的选择。所以实际上,如果它不是太大,你可以通过检查整个模型文件来搭载任何版本控制系统。 Web服务器可以在启动/更新时反序列化(pickle.load)此文件,并转换为可以调用预测方法的Python对象。
选项2 :使用predictive modeling markup language。 PMML专门为此目的而开发:预测建模数据交换格式独立于环境。因此,数据科学家可以开发模型,将其导出为PMML文件。然后,用于预测的Web服务器可以使用PMML文件进行预测。您一定要检查the open scoring project,它允许您通过REST API公开机器学习模型,以便部署模型和进行预测。
无论您选择哪种方案,请考虑支持该方案的长期成本。如果您的工作处于概念验证阶段,基于Python烧瓶的Web服务器+腌制模型文件将是最佳途径。希望这个答案可以帮到你!
答案 3 :(得分:0)
正如其他答案中已经建议的那样,最好的选择是创建一个简单的Web服务。除了Flask之外,您可能还想尝试bottle这是一个非常薄的单文件Web框架。您的服务可能看起来很简单:
from bottle import route, run, request
@route('/')
def index():
return my_function(request.json)
run(host='0.0.0.0', port=8080)
为了保持环境相同,检查virtualenv以建立隔离环境以避免与已安装的软件包冲突,并pip将软件包的精确版本安装到虚拟环境中。
答案 4 :(得分:-1)
我猜你有三种可能性:
假设“技术团队”使用Javascript进行Web服务,您可以尝试使用{{3}将您的python函数直接转换为Javascript函数(这将很容易在网页上集成) }(基于empythoned)
这种方法的缺点是每次需要更新/升级你的python函数时,你还需要再次转换为Javascript,然后检查&amp;验证该功能是否继续有效。
如果转换方法不可能,我同意@ justin-bell,你可以使用FLASK
获取JSON作为输入&gt; JSON到你的函数参数&gt;运行python函数&gt;将函数结果转换为JSON&gt;提供JSON结果
假设您选择了FLASK解决方案,“tech-team”只需要发送异步。 GET / POST请求包含所有参数作为JSON obj,当他们需要从python函数获取一些结果时。
您还可以使用Websocket查看发送到Web服务(请查看您身边的flask + websocket以及web服务端的emscripten。)
=&GT; websocket非常有用,当您需要以低成本和延迟(或来自)许多用户推送/接收数据时(不确定websocket最适合您的需求)
此致