华为云用户手册

  • 输出 推理结果以“JSON”体的形式返回,具体字段请参见表1。 表1 参数说明 字段名 类型 描述 detection_classes 字符串数组 输出物体的检测类别列表,如["yunbao","cat"] detection_boxes 数组,元素为浮点数数组 输出物体的检测框坐标列表,坐标表示为 detection_scores 浮点数数组 输出每种检测列表的置信度,用来衡量识别的准确度。 推理结果的“JSON Schema”表示如下: { "type": "object", "properties": { "detection_classes": { "items": { "type": "string" }, "type": "array" }, "detection_boxes": { "items": { "minItems": 4, "items": { "type": "number" }, "type": "array", "maxItems": 4 }, "type": "array" }, "detection_scores": { "items": { "type": "string" }, "type": "array" } } }
  • 发布至AI云商店 华为云云商店有完整的售前、交易、售后的保障体系,用户无需担忧交易,省心省力。在您完成模型的训练和导入之后,您可以将自己的模型发布至AI云商店进行商品售卖。请在首次发布商品前入驻华为云商店成为企业级卖家。 登录ModelArts管理控制台,在左侧导航栏中选择“AI应用”,进入AI应用列表页面。 单击AI应用左侧的单选按钮,在列表页底部展开“版本列表”,单击“操作”列的“发布”进入发布页面。 在发布弹出框中,单击“前往AI 云商店”进入商店。 图2 前往云商店 进入云商店后,请参考发布AI资产类商品操作指导。
  • 发布至AI Gallery ModelArts提供了“AI Gallery”功能,方便将个人的模型等共享给所有ModelArts用户,您也可以从“AI Gallery”获取他人共享的内容,快速完成构建。在您完成模型的训练和导入之后,您可以将自己的模型分享至“AI Gallery”,进行知识共享。 登录ModelArts管理控制台,在左侧导航栏中选择“AI应用”,进入AI应用列表页面。 单击AI应用左侧的单选按钮,在列表页底部展开“版本列表”,单击“操作”列的“发布”进入发布页面。 在发布弹出框中,单击“前往AI Gallery”进入AI Gallery。 图1 前往AI Gallery 进入AI Gallery后,请参考发布免费模型。
  • 背景说明 WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
  • 请求样例 该模式下的推理方式均为输入一张待处理图片,响应的“JSON”根据模型改变而改变。示例如下: 页面预测 Postman调REST接口预测 部署上线成功后,您可以从服务详情页的调用指南中获取预测接口地址。选择“Body”设置请求体,“key”选择为“images”,选择为“File”类型,接着通过选择文件按钮选择需要处理的图片,最后单击“send”,发送您的预测请求。 图1 调用REST接口
  • 查看AI应用详情 当AI应用创建成功后,您可以进入AI应用详情页查看AI应用的信息。 登录ModelArts管理控制台,在左侧菜单栏中选择“AI应用”,进入“我的AI应用”列表页面。 单击目标AI应用名称,进入AI应用详情页面。 您可以查看AI应用的基本信息、模型精度,以及切换页签查看更多信息。 表1 AI应用基本信息 参数 说明 名称 AI应用的名称。 状态 AI应用当前状态。 版本 AI应用当前版本。 ID AI应用的ID。 描述 单击编辑按钮,可以添加AI应用的描述。 部署类型 AI应用支持部署的服务类型。 元模型来源 显示元模型的来源,主要有从训练中选择、从对象存储服务(OBS)中选择、从容器镜像中选择。不同来源的元模型,AI应用显示的参数会不同。 训练作业名称 若元模型来源于训练作业,则显示关联的训练作业,单击训练作业名称可以直接跳转到训练作业详情页面。 训练作业版本 若元模型来源于训练作业且为旧版训练作业,显示训练作业版本。 元模型存储路径 若元模型来源于对象存储服务,显示元模型的存放路径。 容器镜像存储路径 若元模型来源于容器镜像,显示容器镜像存储路径。 AI引擎 若元模型来源于训练作业/对象存储服务,显示AI应用使用的AI引擎。 引擎包地址 若元模型来源于对象存储服务(AI引擎为Custom),显示引擎包地址。 运行环境 若元模型来源于训练作业/对象存储服务(AI引擎为预置引擎),显示元模型依赖的运行环境。 容器调用接口 若元模型来源于对象存储服务(AI引擎为Custom)/容器镜像,显示AI应用启动的协议和端口号。 推理代码 若元模型来源于训练作业且为旧版训练作业,则显示推理代码的存放路径。 镜像复制 若元模型来源于对象存储服务/容器镜像,显示镜像复制功能状态。 动态加载 若元模型来源于训练作业/对象存储服务,显示AI应用是否支持动态加载。 大小 AI应用的大小。 健康检查 若元模型来源于对象存储服务/容器镜像,显示健康检查状态。当健康检查为开启时,显示以下字段:检查方式、健康检查URL、健康检查周期、延迟时间、健康检查最大失败次数。 AI应用说明 显示创建AI应用时添加的AI应用说明文档信息。 系统运行架构 显示系统运行架构。 推理加速卡类型 显示推理加速卡类型。 表2 AI应用页签详情 参数 说明 模型精度 显示该AI应用的模型召回率、精准率、准确率和F1值。 参数配置 可以查看AI应用的apis定义详情,以及AI应用的入参和出参。 运行时依赖 查看模型对环境的依赖。当构建任务失败后可以编辑运行时依赖,保存修改后将触发镜像重新构建。 事件 展示AI应用创建过程中的关键操作进展。 事件保存周期为3个月,3个月后自动清理数据。 查看AI应用的事件类型和事件信息,请参见查看AI应用的事件 使用约束 根据创建AI应用时的设置,显示部署服务的使用约束,如请求模式、启动命令、模型加密等。对于异步请求模式的AI应用,可显示输入模式、输出模式、服务启动参数和作业配置参数等参数。 关联服务 展示使用该AI应用部署的服务列表,单击服务名称可以直接跳转到服务详情页面。 父主题: 管理AI应用
  • 模型包规范 模型包必须存储在OBS中,且必须以“model”命名。“model”文件夹下面放置模型文件、模型推理代码。 模型推理代码文件必选,其文件名必须为“customize_service.py”,“model”文件夹下有且只能有1个推理代码文件,模型推理代码编写请参见模型推理代码编写说明。 使用模板导入的模型包结构如下所示: model/ │ ├── 模型文件 //必选,不同的框架,其模型文件格式不同,详细可参考模型包示例。 ├── 自定义Python包 //可选,用户自有的Python包,在模型推理代码中可以直接引用。 ├── customize_service.py //必选,模型推理代码,文件名称必须为“customize_service.py”,否则不视为推理代码。
  • 方式一:使用Python语言发送预测请求 下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。 创建请求体,进行预测请求。 输入为文件格式 # coding=utf-8 import requests import os from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "预测文件的本地路径" # Create request, set method, url, headers and body. method = 'POST' headers = {"x-sdk-content-sha256": "UNSIGNED-PAYLOAD"} request = signer.HttpRequest(method, url, headers) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request files = {'images': open(file_path, 'rb')} resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, files=files) # Print result print(resp.status_code) print(resp.text) “file_path”为预测文件的本地路径,既可使用绝对路径(如Windows格式"D:/test.png",Linux格式"/opt/data/test.png"),也可以使用相对路径(如"./test.png")。 “files”参数的请求体样式为“files={"请求参数":("文件路径",文件内容,“文件类型”)}”,参数填写可以参考表1。 表1 files参数说明 参数 是否必填 说明 请求参数 是 在线服务输入参数名称。 文件路径 否 上传文件的路径。 文件内容 是 上传文件的内容。 文件类型 否 上传文件类型。当前支持以下类型: txt类型:text/plain jpg/jpeg类型:image/jpeg png类型:image/png 输入为文本格式(json类型) 读取本地预测文件并进行base64编码的请求体示例如下: # coding=utf-8 import base64 import json import os import requests from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "预测文件的本地路径" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # Create request, set method, url, headers and body. method = 'POST' headers = { 'Content-Type': 'application/json' } body = { 'image': base64_data } request = signer.HttpRequest(method, url, headers, json.dumps(body)) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, data=request.body) # Print result print(resp.status_code) print(resp.text) “body”中的参数名由在线服务的输入参数决定,需要和“类型”为“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。
  • 方式二:使用Java语言发送预测请求 下载Java SDK并在开发工具中完成SDK配置。具体操作请参见在Java环境中集成API请求签名的SDK 创建Java类,进行预测请求。 由于在APIG的Java SDK中,“request.setBody()”只支持String类型,所以只支持输入为文本格式的预测请求。如果输入的是文件格式,需要先进行base64编码转换成文本。 输入为文件格式 此处以json格式为例介绍读取本地预测文件并进行base64编码的请求体,请求体示例如下: package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class MyAkSkTest2 { public static void main(String[] args) { String url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String filePath = "预测文件的本地路径"; try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // build your json body String body = "{\"image\":\"" + getBase64FromFile(filePath) + "\"}"; // Special characters, such as the double quotation mark ("), contained in the body must be escaped. request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } /** * Convert the file into a byte array and Base64 encode it * @return */ private static String getBase64FromFile(String filePath) { // Convert the file into a byte array InputStream in = null; byte[] data = null; try { in = new FileInputStream(filePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // Base64 encode return new String(Base64.encodeBase64(data)); } } 使用base64编码方式,需要在模型推理代码中增加对请求体解码的代码。 输入为文本格式(json类型) // Package name of the demo. package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyAkSkTest { public static void main(String[] args) { String url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // Special characters, such as the double quotation mark ("), contained in the body must be escaped. String body = "{}"; request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } } “body”由具体文本格式决定,此处以json为例。
  • 获取AK/SK 如果已生成过AK/SK,则可跳过此步骤,找到原来已下载的AK/SK文件,文件名一般为:credentials.csv。 如下图所示,文件包含了租户名(User Name),AK(Access Key Id),SK(Secret Access Key)。 图1 credential.csv文件内容 AK/SK生成步骤: 注册并登录管理控制台。 单击右上角的用户名,在下拉列表中单击“我的凭证”。 单击“访问密钥”。 单击“新增访问密钥”,进入“身份验证”页面。 根据提示完成身份验证,下载密钥,并妥善保管。
  • 创建AI应用操作步骤 登录ModelArts管理控制台,在左侧导航栏中选择“AI应用”,进入AI应用列表页面。 单击左上角的“创建”,进入“创建AI应用”页面。 在“创建AI应用”页面,填写相关参数。 填写AI应用基本信息,详细参数说明请参见表1。 表1 AI应用基本信息参数说明 参数名称 说明 名称 AI应用名称。支持1~64位可见字符(含中文),名称可以包含字母、中文、数字、中划线、下划线。 版本 设置所创建AI应用的版本。第一次导入时,默认为0.0.1。 说明: AI应用创建完成后,可以通过创建新版本,导入不同的元模型进行调优。 描述 AI应用的简要描述。 填写元模型来源及其相关参数。当“元模型来源”选择“从对象存储服务(OBS)中选择”时,其相关的参数配置请参见表2。 针对从OBS导入的元模型,ModelArts要求根据模型包规范,编写推理代码和配置文件,并将推理代码和配置文件放置元模型存储的“model”文件夹下。如果您选择的目录下不符合模型包规范,将无法创建AI应用。 图1 从OBS中选择元模型 表2 元模型来源参数说明 参数 说明 “选择元模型” 选择元模型存储的OBS路径。 OBS路径不能含有空格,否则创建AI应用会失败。 “AI引擎” 根据您选择的元模型存储路径,将自动关联出元模型使用的“AI引擎”。 如果“AI引擎”是Custom引擎时,需要配置容器调用接口,用于指定模型启动的协议和端口号。固定请求协议是HTTPS,端口号为8080。 “健康检查” 用于指定模型的健康检查。选择了“AI引擎”和“运行环境”后,部分支持健康检查的引擎会显示该参数。使用Custom引擎时,需要在镜像中配置健康检查接口,否则会导致服务部署失败。 检查方式:可以选择“HTTP请求检查”或者“执行命令检查”。 使用Custom引擎时,支持选择“HTTP请求检查”或者“执行命令检查”。 使用非Custom引擎时,仅支持选择“HTTP请求检查”。 健康检查URL:“检查方式”选择“HTTP请求检查”时显示,填写健康检查的URL,默认值为“/health”。 健康检查命令:“检查方式”选择“执行命令检查”时显示,填写健康检查的命令。 健康检查周期:填写1-2147483647之前的整数,单位为秒。 延迟时间(秒):实例启动后,延迟执行健康检查的时间。填写0-2147483647之间的整数,单位为秒,不能为空。 健康检查最大失败次数:填写1-2147483647之间的整数。在服务启动阶段,当健康检查请求连续失败达到所填次数后,服务会进入异常状态;在服务运行阶段,当健康检查请求连续失败达到所填次数后,服务会进入告警状态。 说明: 使用Custom引擎时需要符合自定义引擎规范,请参见使用自定义引擎创建AI应用。 当AI应用配置了健康检查,部署的服务在收到停止指令后,会延后3分钟才停止。 “动态加载” 用于实现快速部署和快速更新模型。若勾选“动态加载”,则模型文件和运行时依赖仅在实际部署时拉取。单个模型文件大小超过5GB,需要配置“动态加载”。 “运行时依赖” 罗列选中模型对环境的依赖。例如依赖“tensorflow”,安装方式为“pip”,其版本必须为1.8.0及以上版本。 “AI应用说明” 为了帮助其他AI应用开发者更好的理解及使用您的AI应用,建议您提供AI应用的说明文档。单击“添加AI应用说明”,设置“文档名称”及其“URL”。AI应用说明支持增加3条。 “配置文件” 系统默认关联您存储在OBS中的配置文件。打开开关,您可以直接在当前界面查看或编辑模型配置文件。 说明: 该功能即将下线,后续请根据“AI引擎”、“运行时依赖”和“apis定义”修改模型的配置信息。 “部署类型” 选择此AI应用支持部署服务的类型,部署上线时只支持部署为此处选择的部署类型,例如此处只选择在线服务,那您导入后只能部署为在线服务。当前支持“在线服务”、“批量服务”和“边缘服务”。 “apis定义” 提供AI应用对外Restfull api数据定义,用于定义AI应用的输入、输出格式。apis定义填写规范请参见模型配置文件编写说明中的apis参数说明,示例代码请参见apis参数代码示例。 确认信息填写无误,单击“立即创建”,完成AI应用创建。 在AI应用列表中,您可以查看刚创建的AI应用及其对应的版本。当AI应用状态变更为“正常”时,表示AI应用创建成功。在此页面,您还可以创建新版本、快速部署服务、发布AI应用等操作。
  • 前提条件 ModelArts在线服务正常运行。 已在云监控页面设置告警规则,具体操作请参见设置告警规则。 在线服务已正常运行一段时间(约10分钟)。 对于新创建的在线服务,需要等待一段时间,才能查看上报的监控数据和监控视图。 故障、删除状态的在线服务,无法在云监控中查看其监控指标。当在线服务再次启动或恢复后,即可正常查看。 对接云监控之前,用户无法查看到未对接资源的监控数据。具体操作,请参见设置告警规则。
  • 输出 预测结果以“JSON”格式返回,“JSON”字段说明请参见表3。 表3 JSON字段说明 字段名 类型 描述 data Data结构 包含预测数据。“Data结构”说明请参见表4。 表4 Data结构说明 字段名 类型 描述 resp_data RespData结构数组 预测结果列表。 与“ReqData”一样,“RespData”也是“Object”类型,表示预测结果,其具体组成结构由业务场景决定。建议使用该模式的模型,其自定义的推理代码中的后处理逻辑应输出符合模式所定义的输出格式的数据。 预测结果的“JSON Schema”表示如下: { "type": "object", "properties": { "data": { "type": "object", "properties": { "resp_data": { "type": "array", "items": [{ "type": "object", "properties": {} }] } } } } }
  • 请求样例 该模式下的推理方式均为输入“JSON”格式的待预测数据,预测结果以“JSON”格式返回。示例如下: 页面预测 在服务详情的“预测”页签,输入预测代码,单击“预测”即可获取检测结果。 Postman调REST接口预测 部署上线成功后,您可以从服务详情页的调用指南中获取预测接口地址,预测步骤如下: 选择“Headers”设置请求头部,“Content-Type”的值设为“application/json”,“X-Auth-Token”的值设为用户实际获取的token值。 图1 预测设置请求头部 选择“Body”设置请求体,编辑需要预测的数据,最后单击“send”,发送您的预测请求。
  • 输入 系统预置预测分析输入输出模式,适用于预测分析的模型,使用该模式的模型将被标识为预测分析模型。预测请求路径“/”,请求协议为“HTTP”,请求方法为“POST”,调用方需采用“application/json”内容类型,发送预测请求,请求体以“JSON”格式表示,“JSON”字段说明请参见表1。选择该模式时需确保您的模型能处理符合该输入“JSON Schema”格式的输入数据。“JSON Schema”格式说明请参考官方指导。 表1 JSON字段说明 字段名 类型 描述 data Data结构 包含预测数据。“Data结构”说明请参见表2。 表2 Data结构说明 字段名 类型 描述 req_data ReqData结构数组 预测数据列表。 “ReqData”,是“Object”类型,表示预测数据,数据的具体组成结构由业务场景决定。使用该模式的模型,其自定义的推理代码中的预处理逻辑应能正确处理模式所定义的输入数据格式。 预测请求的“JSON Schema”表示如下: { "type": "object", "properties": { "data": { "type": "object", "properties": { "req_data": { "items": [{ "type": "object", "properties": {} }], "type": "array" } } } } }
  • 模型包规范 模型包必须存储在OBS中,且必须以“model”命名。“model”文件夹下面放置模型文件、模型推理代码。 模型推理代码文件必选,其文件名必须为“customize_service.py”,“model”文件夹下有且只能有1个推理代码文件,模型推理代码编写请参见模型推理代码编写说明。 使用模板导入的模型包结构如下所示: model/ │ ├── 模型文件 //必选,不同的框架,其模型文件格式不同,详细可参考模型包示例。 ├── 自定义Python包 //可选,用户自有的Python包,在模型推理代码中可以直接引用。 ├── customize_service.py //必选,模型推理代码,文件名称必须为“customize_service.py”,否则不视为推理代码。
  • TensorFlow的推理脚本示例 TensorFlow MnistService示例如下。更多TensorFlow推理代码示例请参考TensorFlow、TensorFlow 2.1。其他引擎推理代码请参考PyTorch、Caffe。 推理代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from PIL import Image import numpy as np from model_service.tfserving_model_service import TfServingBaseService class MnistService(TfServingBaseService): def _preprocess(self, data): preprocessed_data = {} for k, v in data.items(): for file_name, file_content in v.items(): image1 = Image.open(file_content) image1 = np.array(image1, dtype=np.float32) image1.resize((1, 784)) preprocessed_data[k] = image1 return preprocessed_data def _postprocess(self, data): infer_output = {} for output_name, result in data.items(): infer_output["mnist_result"] = result[0].index(max(result[0])) return infer_output 请求 curl -X POST \ 在线服务地址 \ -F images=@test.jpg 返回 {"mnist_result": 7} 在上面的代码示例中,完成了将用户表单输入的图片的大小调整,转换为可以适配模型输入的shape。首先通过Pillow库读取“32×32”的图片,调整图片大小为“1×784”以匹配模型输入。在后续处理中,转换模型输出为列表,用于Restful接口输出展示。
  • XGBoost的推理脚本示例 更多机器学习引擎的推理代码请参考Pyspark、Scikit Learn。 # coding:utf-8 import collections import json import xgboost as xgb from model_service.python_model_service import XgSklServingBaseService class UserService(XgSklServingBaseService): # request data preprocess def _preprocess(self, data): list_data = [] json_data = json.loads(data, object_pairs_hook=collections.OrderedDict) for element in json_data["data"]["req_data"]: array = [] for each in element: array.append(element[each]) list_data.append(array) return list_data # predict def _inference(self, data): xg_model = xgb.Booster(model_file=self.model_path) pre_data = xgb.DMatrix(data) pre_result = xg_model.predict(pre_data) pre_result = pre_result.tolist() return pre_result # predict result process def _postprocess(self, data): resp_data = [] for element in data: resp_data.append({"predict_result": element}) return resp_data
  • MindSpore的推理脚本示例 snt3芯片目前只有北京四提工单申请权限后才可以使用,支持模型格式为.om,推理脚本如下: from __future__ import absolute_import from __future__ import division from __future__ import print_function import json import os import numpy as np from PIL import Image from hiai.nn_tensor_lib import NNTensor from hiai.nntensor_list import NNTensorList from model_service.hiai_model_service import HiaiBaseService class DemoService(HiaiBaseService): def __init__(self, *args, **kwargs): # 默认加载模型包目录下的om文件 super(DemoService, self).__init__(*args, **kwargs) self.labels_list = None self.is_multilabel = False def _preprocess(self, data): preprocessed_data = {} images = [] for k, v in data.items(): for file_name, file_content in v.items(): image = Image.open(file_content) image = np.array(image) # NHWC # AIPP should use RGB format. # mean reg is applied in AIPP. # Transpose is applied in AIPP tensor = NNTensor(image) images.append(tensor) tensor_list = NNTensorList(images) preprocessed_data['images'] = tensor_list return preprocessed_data def _inference(self, data, image_info=None): result = {} for k, v in data.items(): result[k] = self.model.proc(v) return result def _postprocess(self, data): # 这里增加自己的后处理 return str(data)
  • 自定义推理逻辑的推理脚本示例 首先,需要在配置文件中,定义自己的依赖包,详细示例请参见使用自定义依赖包的模型配置文件示例。然后通过如下示例代码,实现了“saved_model”格式模型的加载推理。 当前推理基础镜像使用的python的logging模块,采用的是默认的日志级别Warnning,即当前只有warning级别的日志可以默认查询出来。如果想要指定INFO等级的日志能够查询出来,需要在代码中指定logging的输出日志等级为INFO级别。
  • 映射关系示例 如下示例展示了配置文件、映射规则、csv数据以及最终推理请求的关系。 假设,您的模型所用配置文件,其apis参数如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [ { "method": "post", "url": "/", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "data": { "type": "object", "properties": { "req_data": { "type": "array", "items": [ { "type": "object", "properties": { "input_1": { "type": "number" }, "input_2": { "type": "number" }, "input_3": { "type": "number" }, "input_4": { "type": "number" } } } ] } } } } } } } ] 此时,其对应的映射关系如下所示。ModelArts管理控制台将从配置文件中自动解析映射关系,如果您调用ModelArts API时,需要自行根据规则编写映射关系。 { "type": "object", "properties": { "data": { "type": "object", "properties": { "req_data": { "type": "array", "items": [ { "type": "object", "properties": { "input_1": { "type": "number", "index": 0 }, "input_2": { "type": "number", "index": 1 }, "input_3": { "type": "number", "index": 2 }, "input_4": { "type": "number", "index": 3 } } } ] } } } } } 用户需要进行推理的数据,即CSV数据,格式如下所示。数据必须以英文逗号隔开。 5.1,3.5,1.4,0.2 4.9,3.0,1.4,0.2 4.7,3.2,1.3,0.2 根据定义好的映射关系,最终推理请求样例如下所示,与在线服务使用的格式类似: { "data": { "req_data": [{ "input_1": 5.1, "input_2": 3.5, "input_3": 1.4, "input_4": 0.2 }] } }
  • 创建AI应用的几种场景 从训练中选择:在ModelArts中创建训练作业,并完成模型训练,在得到满意的模型后,可以将训练后得到的模型创建为AI应用,用于部署服务。 从对象存储服务(OBS)中选择:如果您使用常用框架在本地完成模型开发和训练,可以将本地的模型按照模型包规范上传至OBS桶中,从OBS将模型导入至ModelArts中,创建为AI应用,直接用于部署服务。 从容器镜像中选择:针对ModelArts目前不支持的AI引擎,可以通过自定义镜像的方式将编写的模型镜像导入ModelArts,创建为AI应用,用于部署服务。 从模板中选择:相同功能的模型配置信息重复率高,将相同功能的配置整合成一个通用的模板,通过使用该模板,可以方便快捷的导入模型,创建为AI应用,而不用编写config.json配置文件。 “从模板中选择”功能即将下线。后续您可以通过“从对象存储服务(OBS)中选择”的AI引擎“Custom”模式,导入自定义引擎,来实现AI引擎和模型配置模板化的功能。
  • 访问边缘服务 当边缘服务和边缘节点的状态都处于“运行中”状态,表示边缘服务已在边缘节点成功部署。 您可以通过以下两种方式,在能够访问到边缘节点的网络环境中,对部署在边缘节点上的边缘服务发起预测请求。 方式一:使用图形界面的软件进行预测(以Postman为例) 方式二:使用curl命令发送预测请求 通过方式一和方式二,边缘服务无需安全认证即可访问。如果用户需要设置安全认证,请选择使用自定义镜像创建的AI应用,具体操作请参考官方指导。在制作自定义镜像时,可参考Flask文档使用Flask设计RESTful的认证。
  • 方式一:使用图形界面的软件进行预测(以Postman为例) 下载Postman软件并安装,您可以直接在Chrome浏览器添加Postman扩展程序(也可使用其它支持发送post请求的软件)。 打开Postman,如图1所示。 图1 Postman软件界面 在Postman界面填写参数,以图像分类举例说明。 选择POST任务,将某个边缘节点的调用地址(通过边缘服务详情界面-节点信息页签查看)复制到POST后面的方框。 图2 POST参数填写 在Body页签,根据AI应用的输入参数不同,可分为“文件输入”或“文本输入”。 文件输入 选择“form-data”。在“KEY”值填写AI应用的入参,比如本例中预测图片的参数为“images”。然后在“VALUE”值,选择文件,上传一张待预测图片(当前仅支持单张图片预测)。 图3 填写Body配置 文本输入 选择“raw”,选择JSON(application/json)类型,在下方文本框中填写请求体,请求体样例如下。 { "meta": { "uuid": "10eb0091-887f-4839-9929-cbc884f1e20e" }, "data": { "req_data": [ { "sepal_length": 3, "sepal_width": 1, "petal_length": 2.2, "petal_width": 4 } ] } } 其中,“meta”中可携带“uuid”,返回预测结果时回传此“uuid”用于跟踪请求,如无此需要可不填写meta。“data”包含了一个“req_data”的数组,可传入单条或多条请求数据,其中每个数据的参数由AI应用决定,比如本例中的“sepal_length”、“sepal_width”等。 参数填写完成,单击“Send”发送请求,结果会在Response下的对话框里显示。 文件输入形式的预测结果样例如图4所示,返回结果的字段值根据不同AI应用可能有所不同。 图4 边缘服务文件输入预测结果 文本输入形式的预测结果样例如图5所示,请求体包含“meta”及“data”。如输入请求中包含“uuid”,则输出结果中回传此“uuid”。如未输入,则为空。“data”包含了一个“req_data”的数组,可传入单条或多条请求数据,其中每个数据的参数由AI应用决定,比如本例中的“sepal_length”、“sepal_width”等。 图5 边缘服务文本输入预测结果
  • 约束限制 服务升级关系着业务实现,不当的升级操作会导致升级期间业务中断的情况,请谨慎操作。 ModelArts支持部分场景下在线服务进行无损滚动升级。按要求进行升级前准备,做好验证,即可实现业务不中断的无损升级。 表1 支持无损滚动升级的场景 创建AI应用的元模型来源 服务使用的是公共资源池 服务使用的是专属资源池 从训练中选择元模型 不支持 不支持 从模板中选择元模型 不支持 不支持 从容器镜像中选择元模型 不支持 支持,创建AI应用的自定义镜像需要满足创建AI应用的自定义镜像规范。 从OBS中选择元模型 不支持 不支持
  • 方式一:通过服务管理页面修改服务信息 登录ModelArts管理控制台,在左侧菜单栏中选择“部署上线”,进入目标服务类型管理页面。 在服务列表中,单击目标服务操作列的“修改”,修改服务基本信息,然后根据提示提交修改任务。 当修改了服务的某些参数配置时,系统会自动重启服务使修改生效。在提交修改服务任务时,若涉及重启,会有弹窗提醒。 在线服务参数说明请参见部署为在线服务。修改在线服务还需要配置“最大无效实例数”设置并行升级的最大节点数,升级阶段节点无效。 批量服务参数说明请参见部署为批量服务。 边缘服务参数说明请参见部署为边缘服务。
  • 方式二:通过服务详情页面修改服务信息 登录ModelArts管理控制台,在左侧菜单栏中选择“部署上线”,进入目标服务类型管理页面。 单击目标服务名称,进入服务详情页面。 您可以通过单击页面右上角“修改”,修改服务基本信息,然后根据提示提交修改任务。 当修改了服务的某些参数配置时,系统会自动重启服务使修改生效。在提交修改服务任务时,若涉及重启,会有弹窗提醒。 在线服务参数说明请参见部署为在线服务。修改在线服务还需要配置“最大无效实例数”设置并行升级的最大节点数,升级阶段节点无效。 批量服务参数说明请参见部署为批量服务。 边缘服务参数说明请参见部署为边缘服务。
  • 方式三:使用Python语言通过AppCode认证鉴权方式发送预测请求 下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。 创建请求体,进行预测请求。 输入为文件格式 # coding=utf-8 import requests import os if __name__ == '__main__': # Config url, app code and file path. url = "在线服务的调用地址" # 认证用的app_code硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以app_code保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_APP_CODE。 app_code = os.environ["HUAWEICLOUD_APP_CODE"] file_path = "预测文件的本地路径" # Send request. headers = { 'X-Apig-AppCode': app_code } files = { 'images': open(file_path, 'rb') } resp = requests.post(url, headers=headers, files=files) # Print result print(resp.status_code) print(resp.text) “files”中的参数名由在线服务的输入参数决定,需要和“类型”为“file”的输入参数“名称”保持一致。此处以“images”为例。 输入为文本格式(json类型) 读取本地预测文件并进行base64编码的请求体示例如下: # coding=utf-8 import base64 import requests import os if __name__ == '__main__': # Config url, app code and request body. url = "在线服务的调用地址" # 认证用的app_code硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以app_code保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_APP_CODE。 app_code = os.environ["HUAWEICLOUD_APP_CODE"] file_path = "预测文件的本地路径" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # Send request headers = { 'Content-Type': 'application/json', 'X-Apig-AppCode': app_code } body = { 'image': base64_data } resp = requests.post(url, headers=headers, json=body) # Print result print(resp.status_code) print(resp.text) “body”中的参数名由在线服务的输入参数决定,需要和“类型”为“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。
  • 方式二:使用Java语言通过AppKey+AppSecret认证鉴权方式发送预测请求 下载Java SDK并在开发工具中完成SDK配置。具体操作请参见在Java环境中集成API请求签名的SDK。 创建Java类,进行预测请求。 由于在APIG的Java SDK中,“request.setBody()”只支持String类型,所以只支持输入为文本格式的预测请求。 此处以json格式为例介绍读取本地预测文件并进行base64编码的请求体: // Package name of the demo. package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyAkSkTest { public static void main(String[] args) { String url = "在线服务的调用地址"; // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以appKey和appSecret保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_APP_KEY和HUAWEICLOUD_APP_SECRET。 String appKey = System.getenv("HUAWEICLOUD_APP_KEY"); String appSecret = System.getenv("HUAWEICLOUD_APP_SECRET"); String body = "{}"; try { // Create request Request request = new Request(); // Set the AK/AppSecret to sign and authenticate the request. request.setKey(appKey); request.setSecret(appSecret); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // Special characters, such as the double quotation mark ("), contained in the body must be escaped. request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } } “body”由具体文本格式决定,此处以json为例。
  • APP认证鉴权 当支持APP认证功能的在线服务运行成功处于“运行中”状态,就可以对服务进行调用 。在调用之前您需要进行APP认证鉴权。 当使用APP认证,且开启了简易认证模式,API请求既可以选择使用Appkey和AppSecret做签名和校验,也可以选择使用AppCode进行简易认证(ModelArts默认启用简易认证)。推荐使用AppKey/AppSecret认证,其安全性比AppCode认证要高。 AppKey/AppSecret认证:通过AppKey与AppSecret对请求进行加密签名,可标识发送方并防止请求被修改。使用AppKey/AppSecret认证时,您需要使用专门的签名SDK对请求进行签名。 AppKey:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。 AppSecret:APP私有访问密钥,即与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。 AppKey进行简易认证时,即在调用API的时候,在HTTP请求头部消息增加一个参数“apikey”(参数值为“AppKey”),实现快速认证。 AppCode认证:通过AppCode认证通用请求。 AppCode认证就是在调用API的时候,在HTTP请求头部消息增加一个参数“X-Apig-AppCode”(参数值为“AppCode”),而不需要对请求内容签名,API网关也仅校验AppCode,不校验请求签名,从而实现快速响应。 您可以在服务详情页的“调用指南”页签(如图4)或者在线服务授权管理页面(如图2)获取API接口和AppKey/AppSecret和AppCode。请注意使用图中红框所示的API接口公网地址。当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/predictions/poetry”。 图4 获取API的接口地址
共100000条