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.

RESTful.md 6.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. ## RESTful 接口使用说明
  2. MindSpore Serving支持`GPRC`和`RESTful`两种请求方式。本章节介绍`RESTful`类型请求。
  3. 部署`Serving`参考[快速入门](https://gitee.com/mindspore/serving/blob/master/README_CN.md#快速入门) 章节。
  4. 与通过`master.start_grpc_server("127.0.0.1", 5500)`启动`GRPC`服务不同的是,`RESTful`服务需要通过`master.start_restful_server("0.0.0.0", 1500)`来启动。
  5. ### 1.请求方式
  6. 当前支持`POST`类型的RESTful请求,请求格式如下:
  7. ```
  8. POST http://${HOST}:${PORT}/model/${MODLE_NAME}[/version/${VERSION}]:${METHOD_NAME}
  9. ```
  10. 其中:
  11. - `HOST`:指定访问的IP地址;
  12. - `PORT`:指定访问的端口号;
  13. - `MODEL_NAME`:请求的模型名称;
  14. - `VERSION`:表示版本号。版本号是可选的,若未指定具体版本号,则默认使用模型的最新版本。
  15. - `METHOD_NAME`:表示请求模型的具体方法名称。
  16. 如果使用`curl`工具,RESTful请求方式如下:
  17. ```
  18. curl -X POST -d '${REQ_JSON_MESSAGE}' http://${HOST}:${PORT}/model/${MODLE_NAME}[/version/${VERSION}]:${METHOD_NAME}
  19. ```
  20. 例子:请求`lenet`模型的`predict`方法进行数字图片的推理,请求如下:
  21. ```
  22. curl -X POST -d '{"instances":{"image":{"b64":"babe64-encoded-string"}' http://127.0.0.1:1500/model/lenet/version/1:predict
  23. ```
  24. 其中:`babe64-encoded-string`是数字`1`图片经过`base64`编码之后的字符串。由于字符串比较长,不显式列出。
  25. ### 2.请求输入格式
  26. RESTful支持`Json`请求格式,`key`固定为`instances`,`value`:表示多个实例。
  27. 每个实例通过`key-value`格式的`Json`表示。其中:
  28. - `key`:表示输入名称,需要与请求模型提供的方法的输入参数名称一致,若不一致,则请求失败。
  29. - `value`:表示具体的值。当前支持的`value`类型:
  30. - 标量:`str`、`bytes`、`int`、`float`、`bool`;
  31. `bytes`:通过`base64`编码方式支持。
  32. - 张量:`int`、`float`、`bool`。
  33. 张量通过数组格式表示数据和维度信息。
  34. `Json`中支持的`int`类型:是`int32`表示的范围,`float`类型:是`float32`表示的范围。
  35. 请求格式:
  36. ```
  37. {
  38. "instances":[
  39. {
  40. "input_name1":<value>|<list>|<object>,
  41. "input_name2":<value>|<list>|<object>,
  42. ...
  43. },
  44. {
  45. "input_name1":<value>|<list>|<object>,
  46. "input_name2":<value>|<list>|<object>,
  47. ...
  48. }
  49. ...
  50. ]
  51. }
  52. ```
  53. 例子:
  54. ```
  55. {
  56. "instances":[
  57. {
  58. "tag":"one",
  59. "box":[[1,1],[2,3],[3,4]]
  60. "image":{"b64":"iVBOR...ggg==="}
  61. },
  62. {
  63. "tag":"two"
  64. "box":[[2,2],[5,5],[6,6]]
  65. "image":{"b64":"iVBOR...QmCC", "type":"bytes"}
  66. }
  67. ]
  68. }
  69. ```
  70. 其中:`iVBOR...ggg===`是图片数字`0`经过`base64`编码之后的省略字符串。`iVBOR...QmCC`是图片数字`1`经过`base64`编码之后的省略字符串。不同图片编码出来的字符串可能不同,上述是示意说明。
  71. `bytes`类型需要通过`base64`编码进行表示。`base64`除了支持`bytes`类型,也支持表示其他标量和张量,此时需要通过`type`指定数据类型,通过`shape`指定维度信息。
  72. - `type`:可选,如果不指定,默认为`bytes`;
  73. 支持`int8`、`int16`、`int32`、`int64`、`uint8`、`uint16`、`uint32`、`uint64`、`fp16`、`fp32`、`fp64`、`bool`、`str`、`bytes`. 
  74. - `shape`:可选,如果不指定,默认为`[1]`.
  75. 例子:
  76. 如果要用`base64`编码表示:`int16`的数据类型,`shape`为3*2,值是`[[1,1],[2,3],[3,4]]`的张量,则表示如下:
  77. ```json
  78. {
  79. "instances":[
  80. {
  81. "tag":"one",
  82. "box":{"b64":"AQACAAIAAwADAAQA", "type":"int16", "shape":[3,2]},
  83. "image":{"b64":"iVBOR...ggg==="}
  84. }
  85. ]
  86. }
  87. ```
  88. 其中`AQACAAIAAwADAAQA`:是`[[1,1],[2,3],[3,4]]`经过`base64`编码字后的字符串。
  89. ##### 支持的类型总结如下:
  90. | 支持的类型 | 例子 | 备注 |
  91. | :----------------------------------------------------------: | ------------------------------------------------------------ | ---------------------------------- |
  92. | `int` | 1,[1,2,3,4] | 默认`int32`表示范围 |
  93. | `float` | 1.0,[[1.2, 2.3], [3.0, 4.5]] | 默认`float32`表示范围 |
  94. | `bool` | true,false,[[true],[false]] | `bool`类型 |
  95. | `string` | "hello"或者<br/> {"b64":"aGVsbG8=", "type":"str"} | 直接表示或者指定`type`方式表示 |
  96. | `bytes` | {"b64":"AQACAAIAAwADAAQA"} 或者 <br>{"b64":"AQACAAIAAwADAAQA", "type":"bytes"} | 如果不填`type`,默认为`bytes` |
  97. | `int8`,`int16`,`int32`,`int64`,`uint8`,`uint16`,`uint32`,`uint64` `float16`,`float32`,`bool` | {"b64":"AQACAAIAAwADAAQA", "type":"int16", "shape":[3,2]} | 利用base64编码,表示指定type的数据 |
  98. ### 3.请求应答格式
  99. 应答格式与请求格式保持一致。返回`Json`格式信息。应答格式如下:
  100. ```
  101. {
  102. "instances":[
  103. {
  104. "output_name1":<value>|<list>|<object>,
  105. "output_name2":<value>|<list>|<object>,
  106. ...
  107. },
  108. {
  109. "output_name1":<value>|<list>|<object>,
  110. "output_name2":<value>|<list>|<object>,
  111. ...
  112. }
  113. ...
  114. ]
  115. }
  116. ```
  117. 1. 多实例请求后,如果多实例全部成功处理,则响应格式如下:
  118. 例子:`lenet`请求识别数字`0`和数字`1`
  119. ```json
  120. {
  121. "instances":[
  122. {
  123. "result":0
  124. },
  125. {
  126. "result":1
  127. }
  128. ]
  129. }
  130. ```
  131. 2. 如果部分实例出错,则响应格式如下:
  132. 例子:`lenet`请求识别数字`0`和一个错误数字图片
  133. ```json
  134. {
  135. "instances":[
  136. {
  137. "result":0
  138. },
  139. {
  140. "error_msg":"Preprocess Failed"
  141. }
  142. ]
  143. }
  144. ```
  145. 3. 如果请求全部失败,则响应格式如下:
  146. 例子:`lenet`请求识别两张错误数字图片为例
  147. ```json
  148. {
  149. "instances":[
  150. {
  151. "error_msg":"Preprocess Failed"
  152. },
  153. {
  154. "error_msg":"Time out"
  155. }
  156. ]
  157. }
  158. ```
  159. 4. 出现系统性或者其他解析等错误,则返回格式:
  160. 例子:`lenet`传入非法`Json`字符串
  161. ```json
  162. {
  163. "error_msg":"Parse request failed"
  164. }
  165. ```

A lightweight and high-performance service module that helps MindSpore developers efficiently deploy online inference services in the production environment.