构建深度学习框架运行平台

将为TensorFlow、PyTorch和TorchScript之外的元素构建一个简单的深度学习框架运行平台模型。将展示如何从Python和C++运行推理。

打包和推断接口还具有全面的文档字符串,并提供了API的更详细用法。

打包一个模型

包装模型的第一步是定义一个“问题”(例如,2d对象检测)。
“问题”由四个部分组成: 输入规格

指定输入张量的名称、数据类型和形状的dict列表

输出规格

指定输出张量的名称、数据类型和形状的dict列表

测试输入数据(可选)

如果提供了,将在打包后立即运行推断,以验证模型打包是否正确。如果提供了测试输出数据,则必须提供

测试输出数据(可选)

如果提供,将用测试输入数据测试推理输出是否与测试输出数据匹配。

张量的形状可以不包含任何值,在这种情况下,任何值都是可接受的。也可以在这些形状定义中使用“符号”。该符号的每个实例必须在运行时解析为相同的值。例如,加法模型的问题定义:

INPUT_SPEC = [

# A one dimensional tensor of any size with dtype float32{"name": "x", "dtype": "float32", "shape": ("num_inputs",)},# A one dimensional tensor of the same size with dtype float32{"name": "y", "dtype": "float32", "shape": ("num_inputs",)},

]

OUTPUT_SPEC = [

# The sum of the two tensors{
"name": "out", "dtype": "float32", "shape": (None,)},

]

TEST_INPUT_DATA = {

"x": np.arange(5, dtype=np.float32),"y": np.arange(5, dtype=np.float32),

}

TEST_EXPECTED_OUT = {

"out": np.arange(5) + np.arange(5)

}

x和y形状的符号num_inputs在运行时必须解析为相同的值。

现在已经定义了一个问题,将看到如何在每个当前支持的DL框架中打包一个模型。 TensorFlow

有两种方法可以打包TensorFlow模型。一个是带GraphDef的,另一个是带到冻结图的路径的。这两种方法都需要一个node_name_mapping,该映射将问题定义(见上文)中的张量名称映射到张量流图中的节点。

图表

如果有一个返回GraphDef的函数:

import tensorflow as tf

def create_tf_addition_model():

"""A simple addition model"""g = tf.Graph()with g.as_default():with tf.name_scope("some_namespace"):x = tf.placeholder(tf.float32, name="in_x")y = tf.placeholder(tf.float32, name="in_y")out = tf.add(x, y, name="out")

return g.as_graph_def()

可以将模型打包如下:

from neuropod.packagers import create_tensorflow_neuropod

create_tensorflow_neuropod(

neuropod_path=neuropod_path,model_name="addition_model",graph_def=create_tf_addition_model(),node_name_mapping={"x": "some_namespace/in_x:0","y": "some_namespace/in_y:0","out": "some_namespace/out:0",},input_spec=addition_problem_definition.INPUT_SPEC,output_spec=addition_problem_definition.OUTPUT_SPEC,test_input_data=addition_problem_definition.TEST_INPUT_DATA,test_expected_out=addition_problem_definition.TEST_EXPECTED_OUT,

)

提示

create_tensorflow_neuropod在创建之后立即使用测试数据运行推断。如果模型输出与预期输出不匹配,则引发ValueError。

冻结图表的路径

已经有一个冻结的图形,则可以将模型打包如下:

from neuropod.packagers import create_tensorflow_neuropod

create_tensorflow_neuropod(

neuropod_path=neuropod_path,model_name="addition_model",frozen_graph_path="/path/to/my/frozen.graph",node_name_mapping={"x": "some_namespace/in_x:0","y": "some_namespace/in_y:0","out": "some_namespace/out:0",},input_spec=addition_problem_definition.INPUT_SPEC,output_spec=addition_problem_definition.OUTPUT_SPEC,test_input_data=addition_problem_definition.TEST_INPUT_DATA,test_expected_out=addition_problem_definition.TEST_EXPECTED_OUT,

)

提示

create_tensorflow_neuropod在创建之后立即使用测试数据运行推断。如果模型输出与预期输出不匹配,则引发ValueError。

PyTorch

提示

打包PyTorch模型有点复杂,因为运行网络需要python代码和权重。

如果可能,建议将模型转换为TorchScript。

为了创建Pythorch 包,需要遵循以下几条准则:

只要运行时环境安装了包,绝对导入(例如导入torch)就可以。

对于Python 3,包中的所有其他导入都必须是相对的 与TensorFlow/TorchScript/Keras包相比,这种类型的包的灵活性稍低,因为绝对导入引入了对运行时环境的依赖。这将在将来的版本中得到改进。

假设的加法模型是这样的(存储在/my/model/code/dir/main.py):

import torch

import torch.nn as nn

class AdditionModel(nn.Module):

def forward(self, x, y):

  return {"out": x + y}

def get_model(data_root):

return AdditionModel()

为了打包,需要4样东西:

要存储的任何数据的路径(例如,模型权重)

代码的python_root的路径以及要打包的python_root中任何dir的相对路径

返回给定打包数据路径的模型的入口点函数。

模型的依赖关系。这些应该是python包。

提示

有关每个参数的详细说明,请参阅create_pytorch_eminod的API文档

对于模型:

不需要存储任何数据(因为我们的模型没有权重)

python根目录是/my/model/code/dir,希望将所有代码存储在其中

entrypoint函数是get_模型,entrypoint_包是main(因为代码在主.py在python根目录中) 这意味着:

from neuropod.packagers import create_pytorch_neuropod

create_pytorch_neuropod(

neuropod_path=neuropod_path,model_name="addition_model",data_paths=[],code_path_spec=[{"python_root": '/my/model/code/dir',"dirs_to_package": [""  # Package

everything in the python_root

    ],}],entrypoint_package="main",entrypoint="get_model",input_spec=addition_problem_definition.INPUT_SPEC,output_spec=addition_problem_definition.OUTPUT_SPEC,test_input_data=addition_problem_definition.TEST_INPUT_DATA,test_expected_out=addition_problem_definition.TEST_EXPECTED_OUT,

)

提示

create_pytorch_neuropod创建后立即使用测试数据运行推断。如果模型输出与预期输出不匹配,则引发ValueError。

TorchScript

TorchScript比PyTorch更容易打包(因为不需要存储任何python代码)。

如果有一个附加模型,它看起来像:

import torch

class AdditionModel(torch.jit.ScriptModule):

"""A simple addition model"""@torch.jit.script_methoddef forward(self, x, y):return {"out": x + y}

可以通过运行以下命令对其进行打包:

from neuropod.packagers import create_torchscript_neuropod

create_torchscript_neuropod(

neuropod_path=neuropod_path,model_name="addition_model",module=AdditionModel(),input_spec=addition_problem_definition.INPUT_SPEC,output_spec=addition_problem_definition.OUTPUT_SPEC,test_input_data=addition_problem_definition.TEST_INPUT_DATA,

test_expected_out=addition_problem_definition.TEST_EXPECTED_OUT,

提示

create_torchscript_neuropod在创建后立即使用测试数据运行推断。如果模型输出与预期输出不匹配,则引发ValueError。

Keras

如果有一个Keras附加模型,它看起来像:

def create_keras_addition_model():

"""A simple addition model"""x = Input(batch_shape=(None,), name="x")y = Input(batch_shape=(None,), name="y")out = Add(name="out")([x, y])model = Model(inputs=[x, y], outputs=[out])return model

可以通过运行:

from neuropod.packagers import create_keras_neuropod

create_keras_neuropod(

neuropod_path=neuropod_path,model_name="addition_model",sess=tf.keras.backend.get_session(),model=create_keras_addition_model(),input_spec=addition_problem_definition.INPUT_SPEC,output_spec=addition_problem_definition.OUTPUT_SPEC,test_input_data=addition_problem_definition.TEST_INPUT_DATA,test_expected_out=addition_problem_definition.TEST_EXPECTED_OUT,

)

提示

create_keras_neurood在创建之后立即使用测试数据运行推断。如果模型输出与预期输出不匹配,则引发ValueError。

Python

打包aribtrary Python代码具有与上面打包PyTorch相同的接口。

例如,请参见上面的PyTorch部分,并使用create_python_neurood而不是create_PyTorch_neurood

运行推理

不管底层的DL框架是什么,推理都是完全相同的

来自Python

x = np.array([1, 2, 3, 4])

y = np.array([5, 6, 7, 8])

with load_neuropod(ADDITION_MODEL_PATH) as neuropod:

results = neuropod.infer({“x”: x, “y”: y})

array([6, 8, 10, 12])

print results[“out”]

From C++

#include “neuropod/neuropod.hh”

int main()

{

const std::vector<int64_t> shape = {4};// To show two different ways of adding data, one of our inputs is an

array

// and the other is a vector.const float[]

x_data = {1, 2, 3, 4};

const std::vector<float> y_data = {5, 6, 7, 8};// Load the neuropodNeuropod neuropod(ADDITION_MODEL_PATH);// Add the input data using two different signatures of `copy_from`// (one with a pointer and size, one with a vector)auto x_tensor = neuropod.allocate_tensor<float>(shape);x_tensor->copy_from(x_data, 4);auto y_tensor = neuropod.allocate_tensor<float>(shape);y_tensor->copy_from(y_data);// Run inferenceconst auto output_data = neuropod.infer({{"x", x_tensor},{"y", y_tensor}});const auto out_tensor = output_data->at("out");// {6, 8, 10, 12}const auto out_vector = out_tensor->as_typed_tensor<float>()->get_data_as_vector();// {4}const auto out_shape  = out_tensor->get_dims();

}

提示

这显示了C++ API的基本用法。为了更灵活和高效地使用内存,请参阅C++ API文档。

附录

问题定义示例

二维目标检测的问题定义可能如下所示:

INPUT_SPEC = [

# BGR image{"name": "image", "dtype": "uint8", "shape": (1200, 1920, 3)},

]

OUTPUT_SPEC = [

# shape: (num_detections, 4): (xmin, ymin, xmax, ymax)# These values are in units of pixels. The origin is the top left corner# with positive X to the right and positive Y towards the bottom of the

image

{"name": "boxes", "dtype": "float32", "shape": ("num_detections", 4)},# The list of classes that the network can output# This must be some subset of ['vehicle', 'person', 'motorcycle',

‘bicycle’]

{"name": "supported_object_classes", "dtype": "string", "shape": ("num_classes",)},# The probability of each class for each detection# These should all be floats between 0 and 1{"name": "object_class_probability", "dtype": "float32", "shape": ("num_detections", "num_classes")},

]

构建深度学习框架运行平台相关推荐

  1. 深度学习框架集成平台C++ Guide指南

    深度学习框架集成平台C++ Guide指南 这个指南详细地介绍了神经网络C++的API,并介绍了许多不同的方法来处理模型. 提示 所有框架运行时接口都是相同的,因此本指南适用于所有受支持框架(包括Te ...

  2. windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(三)——模型精度评估代码完善

    重新调试好代码,使用Dinknet34模型对数据集进行训练 数据集大小为1480张图片 运行时间为2022年1月12日16:00 记录下该模型训练时间 但如何评估模型的精度也是一个问题,因此作如下总结 ...

  3. windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(二)——代码运行问题解决

    运行程序 去github上下载Dlinknet的代码 https://github.com/zlckanata/DeepGlobe-Road-Extraction-Challenge 把数据集放进da ...

  4. 刚刚,旷视开源深度学习框架「天元」:Brain++内核,研发和落地都在用;孙剑:COCO三连冠背后的秘密武器...

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 耗费资源打造优化6年,迭代到8.0版本,旷视技术体系的关键支柱,现在正式对外开源. 刚刚,深度学习驱动之下最早创业的中国AI独角兽旷视,宣 ...

  5. 深度学习框架的来龙去脉——史上最全面最新的深度学习框架对比分析

    一.深度学习框架概述与深度学习技术的四大阵营 人工智能从学术理论研究到生产应用的产品化开发过程中通常会涉及到多个不同的步骤和工具,这使得人工智能开发依赖的环境安装.部署.测试以及不断迭代改进准确性和性 ...

  6. 深度学习框架盘点和实践!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 开课吧教育 作者:高民权,前IBM中国数据科学家 深度学习神经网络正步入成熟,而深度学习框架目前 ...

  7. 深度学习框架不能“包治百病”,开发者如何选出最适合自己的?

    随着深度学习关注度和势头上升,深度学习被越来越多的企业和组织的生产实践结合起来.这时,无论是对于深度学习相关专业的初学者,还是已经在企业和组织中从事工业场景应用和研发的开发者来说,选择一个适合自己,适 ...

  8. 云平台运行python_如何免费云端运行Python深度学习框架?

    想运行TuriCreate,却没有苹果电脑,也没有Linux使用经验,怎么办?用上这款云端应用,让你免安装Python运行环境.一分钱不用花,以高性能GPU,轻松玩儿转深度学习. 痛点 <如何用 ...

  9. 阿里 深度学习推理框架_如何通过Knative无服务器框架构建深度学习推理

    阿里 深度学习推理框架 在某些学术界和行业界,深度学习正在获得巨大的动力. 推理(基于预训练模型从现实世界数据中检索信息的能力)是深度学习应用程序的核心. 深度学习推理可用于在图像到达对象存储时对其进 ...

最新文章

  1. c# 返回一个对象实例的浅副本
  2. 解决远程登录MYSQL数据库
  3. 关于SQL Server中索引使用及维护简介
  4. php用什么工具调试代码,详细介绍利用开源的DebugBar工具调试PHP代码(图文)
  5. HDU - 6598 Harmonious Army(最大流最小割)
  6. linux命令编译C语言程序
  7. 7 CO配置-控制-一般控制-维护版本
  8. android环境搭建—— 工欲善其事必先利其器
  9. 计算机开机出现ROM,电脑无法开机提示exiting pxe rom的解决办法
  10. 一次cpu占用100%的故障解决
  11. 希尔伯特变换产生负频率解决方法
  12. FlexBuilder 插件
  13. 读取FBX文件踩坑清单
  14. Cabbage教学(1)——IO和变量
  15. 【媒体聚焦】“我们为什么要为景安点赞”——记景安网络十四年峥嵘岁月
  16. vue2.0自学教程(一):走进vue2.0大观园
  17. ios linux远程控制软件,ios手机远程控制 ToDesk 1.0.9 iOS/iPad 版下载(远程控制软件)-520下载...
  18. 利用连按 5 下 Shift 漏洞破解 win7 开机密码(原理以及实现)
  19. 20191025 前端开发日报
  20. python关于FIFA球员的数据分析

热门文章

  1. 2022-2028年小型风电产业投资及前景预测报告
  2. RPC 笔记(08)— socket 通信(多进程多线程服务器)
  3. 2022-2028年中国打印耗材市场现状调研与进展趋势分析报告
  4. Python 标准库之 datetime
  5. 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
  6. c语言函数传参时候的类型强制装换
  7. 【K8S实践】关于Kubernetes Dashboard的实践学习
  8. Python:urllib2模块的基本使用
  9. minsdk(API23)deviceSdk(API22)
  10. CircularFloatingActionMenu