不久前,在一个遥远的星系中,在一个省级行星上,有一些著名的猴子后代,它们很懒,以至于他们决定发明人工智能。 “嗯,什么?” 他们认为。 最好在顾问的头脑中拥有
一个 “大脑”,该大脑在必要时会为您考虑,您的问题可以迅速得到解决,甚至比活着的人所能做的还要好。而且,在不考虑后果的情况下,他们就开始了自己的猴子反向大脑和积木上的认知过程会分解。 他们思想,思想和思想,您不会相信的-神经元模型,数学学习算法,然后是具有不同拓扑的神经网络。 当然,这说得不太好。 与自然智能相比,存在很多缺陷,但是存在一定范围的问题,这些模型使我们能够以合理的精度进行求解。 逐渐地,数字化和序列化技能开始以神经网络模型的形式出现。 今天,亲爱的宇宙历史爱好者,我们将探讨各种人工智能技能的组织和实施。
关于在Habré上创建和训练神经网络(技能)模型的文章很多,因此我们今天不再讨论。 训练或接受序列化AI技能后,我们希望在目标信息系统中使用它们,从而出现问题。 在实验室的工作原理无法以其原始形式转移到生产中,必须实现整个相关技术堆栈甚至对目标平台进行重大修改(当然,CoreML形式也有例外,但这是特例,仅适用于Apple设备)。 此外,还有许多用于模型开发和序列化的工具,是否真的每个人都需要开发单独的集成解决方案? 此外,即使在实验室中,通常也需要从模型中快速得出结论,而不必等待整个相关开发堆栈的加载。
作为解决这些问题的建议,我想向您介绍一个相对较新的开源工具,该工具在开发与AI相关的项目时可能对您很有用。
0Mind (读取ZeroMind)是一个免费技能服务器。 该解决方案是一个模块化的,通用的,易于扩展的应用程序服务器,具有用于服务(高度可访问的输出)异构机器学习模型的框架元素。 该服务器在Python 3中很丑陋,并使用Tornado进行异步请求处理。 不管使用哪种机器学习框架来准备和序列化模型,0Mind都可以使用通用REST API轻松地使用一种或多种技能。 实际上,该解决方案是一个具有REST API的异步Web服务器,该服务器统一用于处理AI技能模型,并为各种机器学习框架提供了一组适配器。 您可能已经使用过tensorflow服务-这是一个类似的解决方案,但是0Mind不是tf堆栈的,可以在同一端口上服务不同框架的多个模型。 因此,您可以使用简单而熟悉的REST API来实现目标技术,而不是在目标信息系统中实现整个技术堆栈以派生AI模型,此外,准备好的模型仍保留在服务器上并且不会最终出现在软件分发中。 为了避免再次与复杂的术语混淆,让我们继续使用示例并开始使用控制台拼写。
安装方式
这里的一切都很简单:
git clone git@github.com:MisteryX/0Mind.git 0Mind
现在我们有一个工作的服务器实例。 安装依赖项:
cd 0Mind pip3 install -r requirements.txt
或者,如果您使用Conda:
conda install --yes --file requirements.txt
一个重要的警告是
服务器支持几种机器学习
框架 ,并且为了不依赖于它们而添加所有机器学习
框架并且不随其一起安装,您自己决定要使用0Mind实例在主机上加载哪些框架框架,并独立安装和配置这些工具。
客制化
入口点或主服务器可执行文件是
model_pool.py 。
可能的启动选项是
-c或
--config_file ,以及配置文件的路径。 默认情况下,0Mind使用
configs / model_pool_config.json文件作为配置文件。 服务器还使用
config / logger.json文件来控制Python日志记录模块的标准日志记录。
为了演示这些功能,我们可以保留默认配置文件。 在
官方文档中阅读有关配置的更多信息。
主要服务器设置为:id,主机,端口,任务。
id- (编号)模型池的唯一标识符(用于在池的分布式网络中进行平衡和寻址)
主机 -该主机的(字符串)网络地址或域名
port-您要在哪个端口上托管0Mind服务的(数字)(在该主机上应该是免费的)
任务 -(对象列表)随服务加载的任务列表(可能为空)。 在默认配置中,加载了Keras准备的CNN_MNIST演示模型,我们将使用它来演示其功能。
附加(可选)配置参数:
model_types- (字符串列表),您可以通过在列表中指定它们来限制已加载模型的类型。 如果列表为空,则没有限制。
debug- (布尔类型)负责启用或禁用Tornado的调试模式。 在调试模式下,如果发生错误,扩展的错误信息将返回到stdout,这在开发扩展时很有用。
可能性
0Mind中的主要内容是
受支持的框架和
REST API功能的
列表 。
可以使用浏览器或http实用程序执行对REST API的请求。 在本指南以及服务器文档中,我们将使用cURL作为开放系统最简单,最经济的工具。
当前,0Mind API总共有10个请求:
1. http:// $ HOST:$ PORT / info-有关0Mind实例的常规信息
2. http:// $ HOST:$ PORT / info / system-有关运行0Mind的主机的系统信息
3. http:// $ HOST:$ PORT / info / task-有关指定任务的信息
4. http:// $ HOST:$ PORT / info / tasks-实例0Mind的任务列表
5. http:// $ HOST:$ PORT / model / list-加载到池中的模型的标识符列表
6. http:// $ HOST:$ PORT / model / info-显示有关模型的界面信息
7. http:// $ HOST:$ PORT /模型/负载-将新模型上载到池中
8. http:// $ HOST:$ PORT / model / drop-从池中卸载以前加载的模型
9. http:// $ HOST:$ PORT /模型/ predict-请求模型输出
10.http:// $ HOST:$ PORT / command / stop-停止0Mind服务并终止其进程
资讯中心
例如,您可以启动服务器实例,如下所示:
python3 model_pool.py
例如,我们将获得有关正在运行的服务器实例的一般信息:
curl http://127.0.0.1:5885/info
{"service": "ModelPool", "id": 1, "options": {"debug": false}, "version": [1, 1, 4]}
好的,现在我们找出将哪些模型加载到池中:
curl http://127.0.0.1:5885/model/list
{"id": 1, "check_sum": "4d8a15e3cc35750f016ce15a43937620", "models": ["1"]}
现在,让我们澄清标识符为“ 1”的加载模型的接口:
curl http://127.0.0.1:5885/model/info?id=1
{"inputs": {"0": {"name": "conv2d_1_input:0", "type": "float32", "shape": [null, 28, 28, 1]}}, "outputs": {"0": {"name": "dense_2/Softmax:0", "type": "float32", "shape": [null, 10]}}, "tool": "keras"}
剩下的工作就是找出模型要使用的过滤器。 为此,我们阐明了加载标识符为“ 1”的模型的任务的详细信息:
curl http://127.0.0.1:5885/info/task?id=1
{"id": "1", "model_file": "ML/models/mnist_cnn_model.keras", "model_type": "keras", "input_filters": {"conv2d_1_input:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "output_filters": {}}
如您所见,我们的模型有一个输入过滤器-i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter,它过滤名称为-conv2d_1_input:0的输入。 该过滤器仅将指定的图像文件转换为张量,并根据模型输入对其进行缩放。
过滤器是另一个很棒的0Mind通用工具。 由于模型数据的预处理和后处理是相同的,因此您可以简单地累积这些过滤器,以快速用于其他模型的进一步处理,从而将所需任务指示为加载模型的属性。
来自模型的数据输出(推论)
好了,现在我们有了推理所需的所有信息,我们可以从模型中得出结论。 作为输入,我们使用0Mind
样本/ image5.png发行版中包含的测试套件中的图像:
curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=1
使用i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter过滤器的conv2d_1_input:0模型的唯一输入是过滤器接受的格式的数据-[{“ image_file”:“ samples / image5.png”}]。 响应0Mind,我们得到模型输出:
{"result": {"dense_2/Softmax:0": [[2.190017217283827e-21, 1.6761866200587505e-11, 2.2447325167271673e-14, 0.00011080023978138342, 1.881280855367115e-17, 0.9998891353607178, 1.6690393796396863e-16, 9.67975005705668e-12, 1.1265206161566871e-13, 2.086113400079359e-13]]}, "model_time": 0.002135753631591797}
因此,“ dense_2 / Softmax:0”模型的唯一输出(请参见上述模型的信息)为我们提供了该图像分类中模型的置信度矢量。 如您所见,索引为6的类(类为数字0-9)的最高概率是0.99,这对应于数字
5 。 因此,该模型成功地解决了手稿的识别问题,并给出了高度可信的结论。 该模型在0Mind主机上的推理时间为0.002135753631591797秒,因为 输出是在常规的x86 CPU上。
动态加载和卸载模型
现在从池中卸载我们的模型:
curl http://127.0.0.1:5885/model/drop?id=1
{"result": true, "unload_time": 0.000152587890625, "memory_released": 0, "model_id": "1"}
我们再次加载相同的模型,但是现在使用不同的标识符(“ new”)和io_argmax.ArgMaxFilter模型的输出过滤器,该模型很可能从模型置信度向量中得出索引。 我们将不得不更改模型的输入和输出的索引-这是由于Keras的特性:
curl -d '{"id": "new", "output_filters": {"dense_2_1/Softmax:0": ["io_argmax.ArgMaxFilter"]}, "model_file": "ML/models/mnist_cnn_model.keras", "input_filters": {"conv2d_1_input_1:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "model_type": "keras"}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/load
{"result": true, "load_time": 0.45618462562561035, "memory_consumed": 16183296, "model_id": "new"}
现在,我们要求模型在一个请求
样本/ image5.png和
samples / image1.png中一次为我们识别两个图像:
curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}, {"image_file": "samples/image1.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=new
{"result": {"dense_2_1/Softmax:0": [5, 1]}, "model_time": 0.003907206535339355}
演示模型没有再犯错误。
扩展名
扩展0Mind的功能并不困难,这要归功于0Mind的模块化架构,在项目中使用流行的工具和良好的代码约定。 主要扩展向量可以是:
- 适配器是用于与新的机器学习和神经网络框架一起工作的中间层类。
- 过滤器是用于输入和离开技能模型的数据处理程序。
- 请求处理程序 -允许您向0Mind API请求和响应添加新功能。