You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 5.8 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # 基于MindSpore部署推理服务
  2. <!-- TOC -->
  3. - [基于MindSpore部署推理服务](#基于mindspore部署推理服务)
  4. - [概述](#概述)
  5. - [启动Serving服务](#启动serving服务)
  6. - [应用示例](#应用示例)
  7. - [导出模型](#导出模型)
  8. - [启动Serving推理服务](#启动serving推理服务)
  9. - [客户端示例](#客户端示例)
  10. - [Python客户端示例](#python客户端示例)
  11. - [C++客户端示例](#cpp客户端示例)
  12. <!-- /TOC -->
  13. <a href="https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced_use/serving.md" target="_blank"><img src="../_static/logo_source.png"></a>
  14. ## 概述
  15. MindSpore Serving是一个轻量级、高性能的服务模块,旨在帮助MindSpore开发者在生产环境中高效部署在线推理服务。当用户使用MindSpore完成模型训练后,导出MindSpore模型,即可使用MindSpore Serving创建该模型的推理服务。当前Serving仅支持Ascend 910。
  16. ## 启动Serving服务
  17. 通过pip安装MindSpore后,Serving可执行程序位于`/{your python path}/lib/python3.7/site-packages/mindspore/ms_serving` 。
  18. 启动Serving服务命令如下
  19. ```bash
  20. ms_serving [--help] [--model_path <MODEL_PATH>] [--model_name <MODEL_NAME>]
  21. [--port <PORT>] [--device_id <DEVICE_ID>]
  22. ```
  23. 参数含义如下
  24. |参数名|属性|功能描述|参数类型|默认值|取值范围|
  25. |---|---|---|---|---|---|
  26. |`--help`|可选|显示启动命令的帮助信息。|-|-|-|
  27. |`--model_path=<MODEL_PATH>`|必选|指定待加载模型的存放路径。|String|空|-|
  28. |`--model_name=<MODEL_NAME>`|必选|指定待加载模型的文件名。|String|空|-|
  29. |`--port=<PORT>`|可选|指定Serving对外的端口号。|Integer|5500|1~65535|
  30. |`--device_id=<DEVICE_ID>`|可选|指定使用的设备号|Integer|0|0~7|
  31. > 执行启动命令前,需将`/{your python path}/lib:/{your python path}/lib/python3.7/site-packages/mindspore/lib`对应的路径加入到环境变量LD_LIBRARY_PATH中 。
  32. ## 应用示例
  33. 下面以一个简单的网络为例,演示MindSpore Serving如何使用。
  34. ### 导出模型
  35. 使用[add_model.py](https://gitee.com/mindspore/mindspore/blob/master/serving/example/export_model/add_model.py),构造一个只有Add算子的网络,并导出MindSpore推理部署模型。
  36. ```python
  37. python add_model.py
  38. ```
  39. 执行脚本,生成`tensor_add.mindir`文件,该模型的输入为两个shape为[2,2]的二维Tensor,输出结果是两个输入Tensor之和。
  40. ### 启动Serving推理服务
  41. ```bash
  42. ms_serving --model_path={model directory} --model_name=tensor_add.mindir
  43. ```
  44. 当服务端打印日志`MS Serving Listening on 0.0.0.0:5500`时,表示Serving服务已加载推理模型完毕。
  45. ### 客户端示例
  46. #### <span name="python客户端示例">Python客户端示例</span>
  47. 获取[ms_client.py](https://gitee.com/mindspore/mindspore/blob/master/serving/example/python_client/ms_client.py),启动Python客户端。
  48. ```bash
  49. python ms_client.py
  50. ```
  51. 显示如下返回值说明Serving服务已正确执行Add网络的推理。
  52. ```
  53. ms client received:
  54. [[2. 2.]
  55. [2. 2.]]
  56. ```
  57. #### <span name="cpp客户端示例">C++客户端示例</span>
  58. 1. 获取客户端示例执行程序
  59. 首先需要下载[MindSpore源码](https://gitee.com/mindspore/mindspore)。有两种方式编译并获取客户端示例程序:
  60. + 从源码编译MindSpore时候,将会编译产生Serving C++客户端示例程序,可在`build/mindspore/serving/example/cpp_client`目录下找到`ms_client`可执行程序。
  61. + 独立编译:
  62. 需要先预装[gRPC](https://gRPC.io)。
  63. 然后,在MindSpore源码路径中执行如下命令,编译一个客户端示例程序。
  64. ```bash
  65. cd mindspore/serving/example/cpp_client
  66. mkdir build && cd build
  67. cmake -D GRPC_PATH={grpc_install_dir} ..
  68. make
  69. ```
  70. 其中`{grpc_install_dir}`为gRPC安装时的路径,请替换为实际gRPC安装路径。
  71. 2. 启动客户端
  72. 执行ms_client,向Serving服务发送推理请求:
  73. ```bash
  74. ./ms_client --target=localhost:5500
  75. ```
  76. 显示如下返回值说明Serving服务已正确执行Add网络的推理。
  77. ```
  78. Compute [[1, 2], [3, 4]] + [[1, 2], [3, 4]]
  79. Add result is 2 4 6 8
  80. client received: RPC OK
  81. ```
  82. 客户端代码主要包含以下几个部分:
  83. 1. 基于MSService::Stub实现Client,并创建Client实例。
  84. ```
  85. class MSClient {
  86. public:
  87. explicit MSClient(std::shared_ptr<Channel> channel) : stub_(MSService::NewStub(channel)) {}
  88. private:
  89. std::unique_ptr<MSService::Stub> stub_;
  90. };MSClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
  91. MSClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
  92. ```
  93. 2. 根据网络的实际输入构造请求的入参Request、出参Reply和gRPC的客户端Context。
  94. ```
  95. PredictRequest request;
  96. PredictReply reply;
  97. ClientContext context;
  98. //construct tensor
  99. Tensor data;
  100. //set shape
  101. TensorShape shape;
  102. shape.add_dims(4);
  103. *data.mutable_tensor_shape() = shape;
  104. //set type
  105. data.set_tensor_type(ms_serving::MS_FLOAT32);
  106. std::vector<float> input_data{1, 2, 3, 4};
  107. //set datas
  108. data.set_data(input_data.data(), input_data.size());
  109. //add tensor to request
  110. *request.add_data() = data;
  111. *request.add_data() = data;
  112. ```
  113. 3. 调用gRPC接口和已经启动的Serving服务通信,并取回返回值。
  114. ```
  115. Status status = stub_->Predict(&context, request, &reply);
  116. ```
  117. 完整代码参考[ms_client](https://gitee.com/mindspore/mindspore/blob/master/serving/example/cpp_client/ms_client.cc)。