• [问题求助] 已经获取token,调用ModelArts给出的模型url时出现错误
    【功能模块】ModelArts 在线部署,调用API【操作步骤&问题现象】1、已经获取token,使用POST方法调用该API时出错。代码与错误如下:【截图信息】1、训练的数据格式:第三列为标签值。2、参数配置:3、POST请求时写的json数据格式:{ "data": { "req_data": [ { "PRES": 1014, "Iws": 6.71, "TEMP": -9 } ] }}4、请求代码:public static String postData(String httpUrl, String param, String tokenStr) throws IOException { HttpURLConnection conn = null; InputStream input= null; OutputStream out = null; BufferedReader buff = null; String result = null; try { URL url = new URL(httpUrl);            conn = (HttpURLConnection) url.openConnection();            conn .setRequestMethod("POST");            conn .setConnectTimeout(10000);            conn .setReadTimeout(50000);            conn .setDoOutput(true);            conn .setDoInput(true);            conn .setRequestProperty("Content-Type", "application/json;charset=utf8");            conn .setRequestProperty("X-Auth-Token", tokenStr);            out = conn .getOutputStream();            out .write(param.getBytes());            out .flush(); result = parseResponse(conn .getInputStream()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != buff ) { try {                    buff .close(); } catch (IOException e) { e.printStackTrace(); } } if (null != out ) { try {                    out .close(); } catch (IOException e) { e.printStackTrace(); } } if (null != input) { try {                    input.close(); } catch (IOException e) { e.printStackTrace(); } }            conn .disconnect(); } return result; }【日志信息】(可选,上传日志内容或者附件)错误日志:
  • [问题求助] 有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的
    有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的,最好数据集不大的,请提供链接,谢谢
  • [问题求助] app与modelarts在线部署模型连接
    【功能模块】ModelArts【操作步骤&问题现象】1、在modelarts平台使用自动学习的预测分析模型,训练完成后将模型进行部署,已经获得了模型的API接口地址。2、训练数据有三列,三个属性,最后一个属性作为标签。给出的参数配置如图所示:现在要在app端去调用这个api接口,app可以接受硬件传给云端的数据,数据属性与模型训练数据属性是一致的。app使用云端监测的数据,传给模型进行预测。使用下述代码获取token:token = new HWMLClientToken(domainName, userName, password, region);请问接下来应该使用哪种方法去调用呢?输入参数要求的数据类型是object,应该将数据转为怎样的格式传给模型呢?请各位不吝赐教。
  • [方案分享] ModelArts 在线服务API对接demo-java版本
    # 1. 服务说明 ModelArts在线服务:将训练好的模型通过modelarts在线服务平台部署为一个Web Service服务。对外提供一个标准的Restful API,可使用HTTPS协议访问。# 2. Api对接前置说明## 2.1 确认服务正常### 2.1.1 确认服务运行状态Ⅰ. 在华为云控制台查看已部署的在线服务,确认状态为运行中。!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/185859gzar2aitfez2ommw.png)Ⅱ. 进入已运行的在线服务,进入预测功能,进行接口调用。a.上传图片!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/185917bas9rulxltospkpk.png)b.图片预测!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/185926uhslqcnczf94hbmt.png)### 2.1.2 获取tokenⅠ. 请求接口方式:https://support.huaweicloud.com/api-iam/iam_30_0001.html集成华为SDK:https://sdkcenter.developer.huaweicloud.com/?product=%E7%BB%9F%E4%B8%80%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1&language=javaⅡ 调试过程,可以使用API Explorer 调用统一身份认证服务 KeystoneCreateUserTokenByPassword接口获取IAM用户token:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IAM&api=KeystoneCreateUserTokenByPassword# 3. Demo适用服务说明该服务调用demo适用于Java语言,调用华为云mdoelarts在线服务、APIG等涉及到图片上传的以及返接口返回信息为json串的接口。# 4. Demo代码 import javax.net.ssl.HttpsURLConnection; import java.io.*; import java.net.URL; /** ** 向华为云上传图片的demo **/ public class UploadImageDemo { public static void main(String[] args) { // 服务器url String modelApi = "https://XXX"; // token String tokenStr = "XXXX"; // 图片的绝对路径 String imageUrl = "C:\%users\\chuyunwei\\Desktop\\yully.jpg"; // 文件控件名称 String fileParamName = "images"; postData(modelApi, tokenStr, imageUrl, fileParamName); } // 发送post请求 public static void postData(String modelApi, String tokenStr, String imageUrl, String fileParamName) { String boundary = java.util.UUID.randomUUID().toString(); String prefix = "--", linend = "\r\n"; String charset = "UTF-8"; // 数据流 DataOutputStream outStream = null; // 连接 HttpsURLConnection connetion = null; // 读取图片的流 InputStream input = null; try { URL url = new URL(modelApi); connetion = (HttpsURLConnection) url.openConnection(); connetion.setReadTimeout(30 * 1000); // 缓存的最长时间 connetion.setDoInput(true);// 允许输入 connetion.setDoOutput(true);// 允许输出 connetion.setUseCaches(false); // 不允许使用缓存 connetion.setRequestMethod("POST"); connetion.setRequestProperty("connection", "keep-alive"); // 设置以二进制传输数据;multipart/form-data: 每个参数以 --boundary 开始 connetion.setRequestProperty("Content-Type", "multipart/form-data;Charsert=UTF-8;boundary=" + boundary); connetion.setRequestProperty("X-Auth-Token", tokenStr); File file = new File(imageUrl); // 设置内容参数 StringBuilder contentParam = new StringBuilder(prefix).append(boundary).append(linend) .append("Content-Disposition: form-data; name=" + fileParamName + "; filename=" + file.getName() + linend) .append("Content-Type: application/octet-stream; charset=" + charset).append(linend).append(linend); outStream = new DataOutputStream(connetion.getOutputStream()); outStream.write(contentParam.toString().getBytes()); input = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = 0; while ((len = input.read(buffer)) != -1) { outStream.write(buffer, 0, len); } input.close(); outStream.write(linend.getBytes()); // 设置请求结束标志符: 以 --boundary-- 为结束符 byte[] endData = (prefix + boundary + prefix + linend).getBytes(); outStream.write(endData); outStream.flush(); // 获取响应结果流 InputStream connetionInput = connetion.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connetionInput, charset)); // 按行读取响应结果 String line = ""; // 读取响应的结果值 StringBuffer resultBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { resultBuffer.append(line); } // 向控制台打印结果 System.out.println(resultBuffer.toString()); } catch (Exception e) { // 打印错误堆栈 e.printStackTrace(); } finally { // 关闭资源 closeResources(outStream, connetion, input); } } // 关闭资源 private static void closeResources(DataOutputStream outStream, HttpsURLConnection connetion, InputStream input) { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } if (outStream != null) { try { outStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (connetion != null) { connetion.disconnect(); } } }# 5. Demo补充说明## 5.1 注释说明 // 服务器url String modelApi = "https://XXX"; // token String tokenStr = "XXXX"; // 图片的绝对路径 String imageUrl = "C:\%users\\chuyunwei\\Desktop\\yully.jpg"; // 文件控件名称 String fileParamName = "images";Ⅰ. rl获取,控制台在线服务器调用指南TOP 页获取:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191342hsdt0d3jgrqyxae1.png)Ⅱ. token,调试过程直接调用:KeystoneCreateUserTokenByPassword接口获取IAM用户token:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IAM&api=KeystoneCreateUserTokenByPasswordⅢ. 图片的绝对路径:图片存放本地,直接使用本机的绝对路径进行获取。Ⅳ. 文件控件名称,即为在线服务API输入图片的参数名称:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191414bzrwlsrtppjrirzr.png)# 6. 实测结果## 6.1 修改配置!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191516au8a4eb8scpraqhs.png)## 6.2 代码调试!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191525ppdaxxrhwx4lipvr.png)调试成功,返回结果。# 7. 问题记录及解决办法## 7.1 服务未启动,运行报错Ⅰ. 在线服务未启动,调试报错如下,重新启动服务即可正常请求。!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191653nmijbmix9linlbmo.png)## 7.2 请求报401错误Ⅰ. 查看错误码,判断401错误为鉴权问题导致,查看modelarts的认证鉴权方式帮助文档。可知请求token时,“auth.scope”的取值需要选择“project”。!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/1917214vlvw9khc59ilept.png)Ⅱ. 我的token获取方式:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191729bgrihqsac0eoyrsl.png)Ⅲ. Modelart token获取方式:按照如下方式获取token后,请求正常。!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191739o1haypjnskpt4toa.png)# 8. 问题解决渠道说明## 8.1 华为云开发者技术支持界面访问链接:https://support.developer.huaweicloud.com/feedback/#/!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/191814czd0vyl5ygo08t6c.png)## 8.2 华为云开发者论坛界面访问链接:https://bbs.huaweicloud.com/forum/forum-1175-1.html!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/23/1918211hmoslfxm9en5fib.png)
  • [其他问题] ModelArts开发环境报错 'No module named 'easydict'
    人工智能作业根据教程做神经网络的鸾尾花分类,我用的是华为云modelart开发环境,镜像是mindspore1.2.0-openmpi2.1.1-ubuntu18.04,规格是2核CPU8G内存,执行代码时报了一个错ModuleNotFoundError: No module named \'easydict\',然后我就在本地的jupyter notebook试了一下,报的是同样的错,应该是本地没有这个模块,搜了一下在命令行用pip命令pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=1000 EasyDict添加了这个模块,之后在本地jupyter notebook跑的时候这行代码就没有问题了,但在mindspore上面还是一直报这个错,是不是mindspore上面用的是他自己的资源库,不是本地的资源库,那他这个缺少库的时候怎么给他导入呢,这个怎么解决呢,想不懂
  • [知识分享] 手把手教你用ModelArts模型部署上线&在线推理(Python版)
    >【摘要】 本文的主要目的是带想用ModelArts的同学过遍ModelArts的基础功能并部署属于你自己的模型在云上,并且能够本地通过python代码调API的方式在线推理【本文以tensorflow 1.13为例】。本文分享自华为云社区《[手把手教你用ModelArts模型部署上线&在线推理](https://bbs.huaweicloud.com/blogs/313145)》, 作者:苏道。## 前言ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。**本文的主要目的是带想用ModelArts的同学过遍ModelArts的基础功能并部署属于你自己的模型在云上,并且能够本地通过python代码调API的方式在线推理【本文以tensorflow 1.13为例】。**## 模型部署阶段### 1、模型格式要求因为模型部署在云上需要在AI框架[tf/pytorch/mxnet]上再套一个serving框架,本文主要利用tensorflow框架,上层的serving框架会对tensorflow的saved model形式比较亲和[推理比较快],所以需要把模型先转成saved model格式的模型,可能的路线是**pb--->saved model / ckpt --->saved model /h5--->saved model**,具体转法同学们可以参考网上的教程~最终生成的saved model文件树如下:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/1142504o6j2cjxmcamndrg.png)variables目录里如下:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/114319a3wxh7qzlht1kqt3.png)值得注意的是,saved model.pb文件只包含了图,不包含权重,权重全部存在了variables目录下,如果同学们转换出来variables里面是空的,pb文件很大,是有问题的,应该是转换代码的问题。### 2、配置文件编写**config.json:**如下是一个简单的config.json文件的内容,runtime 参数定义运行的ai引擎、和推理的环境,reques参数定义当通过request调用这个api时的格式,需要是form-data还是其他,传的是图片file还是string,response定义了推理完模型后返回给请求的格式,dependency是额外需要的一些依赖环境的配置。具体的其他场景怎么编写可以参考官网文档:[模型配置文件编写说明_AI开发平台ModelArts_推理部署_推理规范说明_模型包规范_华为云 (huaweicloud.com)](https://support.huaweicloud.com/inference-modelarts/inference-modelarts-0056.html)```{ "model_type": "TensorFlow", "model_algorithm": "test-resnet", "runtime":"tf1.13-python3.6-cpu", "apis": [{ "protocol": "http", "url": "/", "method": "post", "request": { "Content-type": "multipart/form-data", "data": { "type": "object", "properties": { "sentence": { "type": "string" } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { } } } }] "dependencies": [{ "installer": "pip", "packages": [{ "restraint": "EXACT", "package_version": "1.1.5", "package_name": "pandas" },```### 2、customize_service.py编写这部分主要是定义模型的数据前处理、后处理和推理的接口,以及返回什么内容应该怎么写,下模板是一个无需前后处理,返回QPS和推理结果、时间的例子,更详细的说明可以参考官方文档:[模型推理代码编写说明_AI开发平台ModelArts_推理部署_推理规范说明_模型包规范_华为云 (huaweicloud.com)](https://support.huaweicloud.com/inference-modelarts/inference-modelarts-0057.html)```pyimport loggingimport threadingimport numpy as npimport osimport pandas as pdimport tensorflow as tf # 导入tensorflowfrom PIL import Imagefrom model_service.tfserving_model_service import TfServingBaseServicefrom config import *import timelogger = logging.getLogger()logger.setLevel(logging.INFO)class mnist_service(TfServingBaseService): def __init__(self, model_name, model_path): self.ctx = None self.use_time = 0 def _preprocess(self, data): return data def _inference(self, data): print('ready to infer') time_list = [] start_time = time.time() predict_result = self.sess.run(self.model_outputs, feed_dict=self.model_inputs) time_list.append(time.time() - start_time) use_time = np.mean(time_list) result = {} result['output'] = predict_result.tolist() result['aver_use_time'] = use_time result['QPS'] = 1 / use_time return result def _postprocess(self, data): return data```### 3、打包上传OBS将上述文件按如下图打包到一个文件夹里:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115202nf9jjuv1tft6yjfp.png)上传OBS:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115213lpwlfbrpt0ehpjwn.png)### 4、模型部署选择ModelArts里的模型管理---模型!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/1152449d3oeluocvcvooo6.png)然后在‘’我的模型‘’里选择‘’导入‘’,然后再模型创建界面中的‘**元模型来源**’选择从**OBS**导入,如下图,除了红框需要选择外,其他配置是读取config.json文件自动配置的,然后点击创建即可完成模型部署:![选择模型.PNG](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115348kcqhbmm3h5ib3qyp.png)然后等到模型创建成功:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115428drylxqkxh0xlfllw.png)## 模型上线阶段选择部署上线---在线服务---部署!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115525o8gvc58prdizty3h.png)选择把模型在什么样的资源下上线[gpu/cpu],选择刚才部署上去的模型,和版本号(如果多次部署的话),即可创建成功!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/1155454qx73trco1z5e8tj.png)等待在线服务部署完成会出现,**‘运行中’,便是成功上线了**:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/115610bxbnefye8nwh5jwl.png)## 本地调用在线服务这一节来演示如何用本地调用在线服务。### 1、获取token想要在本地远程推理,首先需要获取token,因为请求的时候会验证token,因为不能谁都乱用你的在线服务对吧。获取token的在线方法:https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IAM&api=KeystoneCreateUserTokenByPassword具体填写方法:1、region 选择在线服务上线的区域2、methods选择password3、domain name、name、password从右上角个人信息那里的“我的凭证”里,domain name就是账户名, name就是IAM用户名,密码就是账号密码4、scope 里只需要填写project name即可,如果是在北京4就填写"cn-north-4",其他就填写其他具体的官网教程:https://support.huaweicloud.com/api-modelarts/modelarts_03_0004.html!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/142619pugpbejtkotisgss.png)!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/142638shmrkbur9wfrvhml.png)获取的token结果是下图箭头的部分,很长,我们把这个token值存为本地txt文件里【token有效期只有24h】:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/142922z7vq3kve0sjo03gs.png)### 2、本地代码编写先在下一个官网代码demo包:https://obs.cn-north-1.myhuaweicloud.com/apig-sdk/ApiGateway-python-sdk.zip来源于官方:https://support.huaweicloud.com/inference-modelarts/inference-modelarts-0024.html#inference-modelarts-0024__zh-cn_topic_0283244602_section8151659179打开demo包,文件结构如下图,主要修改main.py文件:!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/143017kx992e2on2phnu72.png)将main.py修改成如下,其中,token.txt是刚才获取token后写在txt文件的那个文件,url地址从在线服务中的API接口地址来,一般是长这个样子:https://xxxxxxxxxxxxx.apig.cn-north-4.huaweicloudapis.com/v1/infers/aaaa-fccc7-dddd-eeee-xxxxx的形式,如下图,请求采用post方法:```python# coding=utf-8import requestsfrom apig_sdk import signerif __name__ == '__main__': with open('token.txt', 'r') as token_file: token = token_file.readline() X_Auth_Token = token[:-1] headers = {"content-type": "application/json", 'X-Auth-Token': X_Auth_Token} url = "https://xxxxxxxxxxxxx.apig.cn-north-4.huaweicloudapis.com/v1/infers/aaaa-fccc7-dddd-eeee-xxxxx" r = requests.request("POST", url, data=json_data_dumps, headers=headers, verify=False) resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body) print(resp.status_code, resp.reason) print(resp.content)```!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/27/143145sn296drfswjqfbg2.png)接着运行代码即可~。如果打印的status code =200那么说明请求没问题,值得注意的是,请求的数据需要是json的格式。
  • [训练管理] 有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的
    有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的,最好数据集不大的,请提供链接,谢谢
  • [部署上线] 【modelarts】【批量服务】转换后的离线模型在部署批量服务时无法选择计算节点规格
    我们将tensorflow训练好的模型转换成离线om模型后,在部署批量服务时,无法选择计算节点规格,而选择tensorflow的原始模型则是有计算节点规格选项的请问这个问题该如何解决?模型基本信息
  • [其他] 开发自定义脚本
    ---当您使用自定义脚本创建算法时,您需要提前完成算法的代码开发。本章详细介绍如何改造本地代码适配ModelArts云上训练。创建算法时,您需要在创建页面提供代码目录路径、代码目录路径中的启动文件、输入路径参数和训练输出路径参数。这四种输入搭建了用户代码和ModelArts后台交互的桥梁。- 代码目录路径 您需要在OBS桶中指定代码目录,并将训练代码、依赖安装包或者预生成模型等训练所需文件上传至该代码目录下。训练作业创建完成后,ModelArts会将代码目录及其子目录下载至后台容器中。 请注意不要将训练数据放在代码目录路径下。训练数据比较大,训练代码目录在训练作业启动后会下载至后台,可能会有下载失败的风险。 - 代码目录路径中的启动文件 代码目录路径中的启动文件作为训练启动的入口,当前只支持python格式。 - 输入路径参数 训练数据需上传至OBS桶或者存储至[数据集](https://support.huaweicloud.com/dataprepare-modelarts/dataprepare-modelarts-0006.html)中。在训练代码中,用户需解析[输入路径参数](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0008.html#develop-modelarts-0008__zh-cn_topic_0000001133191548_zh-cn_topic_0000001072715070_li1463111565413)。系统后台会自动下载输入参数路径中的训练数据至训练容器的本地目录。请保证您设置的桶路径有读取权限。在训练作业启动后,ModelArts会挂载硬盘至“/cache”目录,用户可以使用此目录来存储临时文件。“/cache”目录大小请参考[训练环境中不同规格资源“/cache”目录的大小](https://support.huaweicloud.com/modelarts_faq/modelarts_05_0090.html) - 训练输出路径参数 建议设置一个空目录为训练输出路径。在训练代码中,您需要解析[输出路径参数](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0008.html#develop-modelarts-0008__zh-cn_topic_0000001133191548_zh-cn_topic_0000001072715070_section16262114175610)。系统后台会自动上传训练输出至指定的训练输出路径,请保证您设置的桶路径有写入权限和读取权限。 在ModelArts中,训练代码需包含以下步骤:#### 解析输入路径参数、输出路径参数运行在ModelArts的模型读取存储在OBS服务的数据,或者输出至OBS服务指定路径,输入和输出数据需要配置3个地方:1. 训练代码中需解析输入路径参数和输出路径参数。ModelArts推荐以下方式实现参数解析。 import argparse \# 创建解析 parser \= argparse.ArgumentParser(description\="train mnist", formatter\_class\=argparse.ArgumentDefaultsHelpFormatter) \# 添加参数 parser.add\_argument('--train\_url', type\=str, help\='the path model saved') parser.add\_argument('--data\_url', type\=str, help\='the training data') \# 解析参数 args, unkown \= parser.parse\_known\_args() 完成参数解析后,用户使用“data\_url”、“train\_url”代替算法中数据来源和数据输出所需的路径。 2. 在使用自定义脚本创建自定义算法时,根据步骤1中的代码参数设置,您需要在创建算法页面配置已定义的输入输出参数。 - 训练数据是算法开发中必不可少的输入。输入数据默认配置为“数据来源”,代码参数为“data\_url”,也支持用户根据步骤1的算法代码自定义代码参数。 **图2** 解析输入路径参数“data\_url” ![](https://support.huaweicloud.com/develop-modelarts/zh-cn_image_0000001133834502.png) - 模型训练结束后,训练模型以及相关输出信息需保存在OBS路径。输出数据默认配置为“模型输出”,代码参数为“train\_url”,也支持用户根据步骤1的算法代码自定义输出路径参数。 **图3** 解析输出路径参数“train\_url” ![](https://support.huaweicloud.com/develop-modelarts/zh-cn_image_0000001179833939.png) 3. 在创建训练作业时,填写输出路径和输出路径。 训练输入选择对应的OBS路径或者数据集路径;训练输出选择对应的OBS路径。 **图4** 训练输入和输出设置 ![](https://support.huaweicloud.com/develop-modelarts/zh-cn_image_0000001146862760.png) #### 训练代码正文和保存模型训练代码正文和保存模型涉及的代码与您使用的AI引擎密切相关。以下案例以Tensorflow框架为例,训练代码中解析参数方式采用tensorflow接口tf.flags.FLAGS接受命令行参数:from \_\_future\_\_ import absolute\_importfrom \_\_future\_\_ import divisionfrom \_\_future\_\_ import print\_functionimport osimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input\_dataimport moxing as moxtf.flags.DEFINE\_integer('max\_steps', 1000, 'number of training iterations.')tf.flags.DEFINE\_string('data\_url', '/home/jnn/nfs/mnist', 'dataset directory.')tf.flags.DEFINE\_string('train\_url', '/home/jnn/temp/delete', 'saved model directory.')FLAGS = tf.flags.FLAGSdef main(\*args): # Train model print('Training model...') mnist = input\_data.read\_data\_sets(FLAGS.data\_url, one\_hot=True) sess = tf.InteractiveSession() serialized\_tf\_example = tf.placeholder(tf.string, name='tf\_example') feature\_configs = {'x': tf.FixedLenFeature(shape=\[784\], dtype=tf.float32),} tf\_example = tf.parse\_example(serialized\_tf\_example, feature\_configs) x = tf.identity(tf\_example\['x'\], name='x') y\_ = tf.placeholder('float', shape=\[None, 10\]) w = tf.Variable(tf.zeros(\[784, 10\])) b = tf.Variable(tf.zeros(\[10\])) sess.run(tf.global\_variables\_initializer()) y = tf.nn.softmax(tf.matmul(x, w) + b, name='y') cross\_entropy = -tf.reduce\_sum(y\_ \* tf.log(y)) tf.summary.scalar('cross\_entropy', cross\_entropy) train\_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross\_entropy) correct\_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y\_, 1)) accuracy = tf.reduce\_mean(tf.cast(correct\_prediction, 'float')) tf.summary.scalar('accuracy', accuracy) merged = tf.summary.merge\_all() test\_writer = tf.summary.FileWriter(FLAGS.train\_url, flush\_secs=1) for step in range(FLAGS.max\_steps): batch = mnist.train.next\_batch(50) train\_step.run(feed\_dict={x: batch\[0\], y\_: batch\[1\]}) if step % 10 == 0: summary, acc = sess.run(\[merged, accuracy\], feed\_dict={x: mnist.test.images, y\_: mnist.test.labels}) test\_writer.add\_summary(summary, step) print('training accuracy is:', acc) print('Done training!') builder = tf.saved\_model.builder.SavedModelBuilder(os.path.join(FLAGS.train\_url, 'model')) tensor\_info\_x = tf.saved\_model.utils.build\_tensor\_info(x) tensor\_info\_y = tf.saved\_model.utils.build\_tensor\_info(y) prediction\_signature = ( tf.saved\_model.signature\_def\_utils.build\_signature\_def( inputs={'images': tensor\_info\_x}, outputs={'scores': tensor\_info\_y}, method\_name=tf.saved\_model.signature\_constants.PREDICT\_METHOD\_NAME)) builder.add\_meta\_graph\_and\_variables( sess, \[tf.saved\_model.tag\_constants.SERVING\], signature\_def\_map={ 'predict\_images': prediction\_signature, }, main\_op=tf.tables\_initializer(), strip\_default\_attrs=True) builder.save() print('Done exporting!')if \_\_name\_\_ == '\_\_main\_\_': tf.app.run(main=main)#### 新旧版训练代码适配的差异旧版训练中,用户需要在输入输出数据上做如下配置:#解析命令行参数import argparseparser = argparse.ArgumentParser(description='MindSpore Lenet Example')parser.add\_argument('--data\_url', type=str, default="./Data", help='path where the dataset is saved')parser.add\_argument('--train\_url', type=str, default="./Model", help='if is test, must provide\\ path where the trained ckpt file')args = parser.parse\_args()...#下载云上数据参数至容器本地,在代码中使用local\_data\_path代表训练输入位置mox.file.copy\_parallel(args.data\_url, local\_data\_path)...#上传容器本地数据至云上obs路径mox.file.copy\_parallel(local\_output\_path, args.train\_url)
  • [开发环境] modelarts 的 jupyterlab怎么把文件夹或文件下载到本地啊?为什么只有上传
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] 将应用发布到ModelArts模型管理
    应用开发并调试完成后,开发者可以将应用服务到ModelArts模型管理模块(后续会升级为应用管理),然后在ModelArts的推理平台进行应用的生产部署。发布应用包含了应用打包、构建镜像和发布这三个步骤。应用打包在terminal命令行执行如下命令将应用打包成rpm包:python manage.py package -s traffic构建镜像将应用打好的rpm包和基础镜像打成新的应用镜像,用于部署。生产部署时,Dockerfile中配置的基础镜像需要选择runtime镜像。cd ./tools/docker/vim Dockerfile # 编写Dockerfile,工程中提供的模板可直接使用,也可以根据需求进行自定义修改vim modelbox-run # 编写镜像启动脚本,其中图配置文件需要按实际修改vim build_image.sh # 编写镜像构建脚本,参考脚本注释说明填写相关参数sh build_image.sh # 执行镜像构建脚本如果需要在镜像构建时使用pip命令安装第三方包,需要配置pip源,参考下面的Dockerfile写法:pip install --user -i http://repo.myhuaweicloud.com/repository/pypi/simple/ --trusted-host repo.myhuaweicloud.com --no-cache-dir <package-name>==<version>镜像构建首次执行大约耗时5~8min,执行成功后镜像将被推送到华为云SWR服务的组织中,SWR地址会打印在terminal控制台。命令执行结束后,镜像构建的日志会在下载至工程log目录下docker-build.log文件中,可通过日志查看构建过程信息。发布和部署应用发布应用进入工程根目录,执行命令行操作,指定应用名称和版本号,--source_location指定上一步推送到SWR的镜像地址。python manage.py create-app --application_name my_app --application_version 1.0.0 --source_location swr.cn-east-3.myhuaweicloud.com/org/image_name:1.0.0更多配置参数,可以使用如下命令查看帮助:python manage.py create-app -h部署应用应用发布成功后,进入“部署上线>在线服务”模块进行部署操作,部署时选择发布的应用进行部署即可。控制台上提供了比开发环境的命令行更为丰富的部署选项,例如服务流量限制、服务自动停止等,用户可以根据需要进行配置,具体可参考部署为在线服务
  • [其他] 应用调试
    图运行方式ModelBox有两种运行图的方式:不携带服务插件运行携带服务插件运行这两种方式的区别是是否携带服务插件,服务插件提供了对接ModelArts推理模块及公有云其他云服务的能力。在本地调试流程图时,往往不需要加载服务插件,只是希望验证流程图本身的正确性,因此采用不带服务插件的运行模式即可。当服务需要部署到推理模块时,或者需要对接真实业务的输入输出流进行调测时,需要切换到携带服务插件的运行模式进行调试。不携带服务插件运行调试(本地输入输出调试)不携带服务插件的运行模式通常使用的是本地的测试输入作为应用输入,例如traffic样例的输入数据存放在/test/data目录下。图1 本地测试数据代码调试使用对应语言的调试方法即可,c++使用gdb,python使用pdb。GDB调试时,需要先配置.vscode目录下的编译配置文件tasks.json和调试配置文件launch.json,具体配置可参考上一章节中样例应用的配置说明。配置好后,直接按F5即可进入调试模式。更多调试使用可参考官网VSCode调试指南。图2 使用VSCode调试代码携带服务插件运行调试(云服务输入输出调试)当需要部署为ModelArts推理服务或接入真实输入输出进行开发调测时,需要选用这种模式。当前该功能仅支持OBS源作为输入和输出。当采用这种调试方式时,需要创建一个新的图文件,并以_iva.toml后缀命名。以视频车辆检测的样例为例:图3 两种运行方式下的图文件这两个图文件的差别主要在于输入和输出的功能单元。当使用本地输入输出调试时,功能单元的配置如图4所示,输入为本地文件,输出为推送到本地的rtsp视频流。图4 本地输入输出功能单元当使用云服务输入输出调试时,功能单元的配置需要和服务插件配合使用,具体写法如图5所示。图5 云服务输入输出功能单元当本地调试完成后需要进行部署到ModelArts推理时,也需要使用携带服务插件运行的图(推理服务仅支持携带服务插件运行模式)。后续进行打包操作时,需要确保CMakeLists.txt中配置的图文件为携带服务插件的图文件。图6 打包配置使用的图文件名称图编写完成后,需要执行如下命令运行图。1. 应用打包,rpm包默认安装在./build/release目录下。python manage.py package -s traffic2. 运行调试服务器。该服务器用于接收ModelBox服务插件发送的任务状态信息。python manage.py run-server3. 新建一个terminal窗口,进入工程目录,运行推理任务。目前只支持OBS输入和输出,需要通过参数--input_path和--output_path指定用户自己的OBS输入和输出路径。python manage.py run-job --input_path obs://video-inference/lp_infer/test_video_vehicle.mp4 --output_path obs://video-inference/test在log文件夹下instance.log记录了实例的状态日志,task.log记录了任务的状态日志。执行该步骤时,如果报下面的错误:failed to verify token: .auth file not exist则是用户未使用ModelArts VSCode插件连接实例,而是使用了其他连接方式,登录信息未写入实例导致的,需要用户切换成使用ModelArts VSCode插件连接的方式。4. 查看推理日志。通过如下命令实时查看modolbox推理的日志信息。tail -f /var/log/modelbox/modelbox-server.log5. 推理任务运行成功后,可以登录OBS服务进入相关的目录查看推理结果。发布部署调试本地调试完成后,开发者可以将自己的应用打包成开发镜像并发布到ModelArts推理服务后查看日志,以确保开发好的应用可以在推理平台正常运行。开发镜像和生产运行镜像的差别在于开发镜像可以打开debug模式输出更多的调试日志,后续还会支持直接terminal接入运行环境进行在线调试。具体调试步骤如下:1. 应用打包,rpm包默认安装在./build/release目录下python manage.py package -s traffic2. 构建镜像构建镜像就是将应用打好的rpm包和基础镜像打成新的应用镜像,在开发调试阶段,基础镜像可以选择develop镜像,在生产部署时需要选择runtime镜像。cd ./tools/docker/vim Dockerfile # 编写Dockerfile,工程中提供的模板可直接使用,也可以根据需求进行自定义修改vim modelbox-run # 编写镜像启动脚本,其中图配置文件需要按实际修改vim build_image.sh # 编写镜像构建脚本,参考脚本注释说明填写相关参数sh build_image.sh # 执行镜像构建脚本执行成功后镜像将被推送到华为云SWR服务的组织中,SWR地址会打印在terminal控制台。命令执行结束后,镜像构建的日志会在下载至工程log目录下docker-build.log文件中,可通过日志查看构建过程信息。3. 发布应用指定应用名称和版本号,--source_location指定上一步推送到SWR的镜像地址。python manage.py create-app --application_name my_app --application_version 1.0.0 --source_location swr.cn-east-3.myhuaweicloud.com/org/image_name:1.0.0执行成功后,应用ID会打印在控制台日志。4. 部署在线服务(异步服务)指定服务名称和版本号,--app_id指定上一步导入成功的应用ID,--specification指定运行的推理资源规格,此处可以选择0.25 T4。python manage.py deploy-service --service_name my_service --app_id xxx --specification modelarts.vm.gpu.0.25t4执行成功后,服务ID会打印在控制台日志。5. 创建作业指定作业名称,--service_id指定上一步部署成功的服务ID,--input指定作业输入的OBS地址,--output指定输出的OBS地址,用户需要根据实际情况自行配置,参数格式均为Json,双引号需要转义。python manage.py create-task --service_id xxx --name my_task --input "{\"type\": \"obs\", \"data\": [{\"bucket\": \"video-inference\", \"path\": \"lp_infer/test_video_vehicle.mp4\", \"index\": 0}]}" --output "{\"obs\": {\"bucket\": \"video-inference\", \"path\": \"result/\"}}"执行成功后,作业ID会打印在控制台日志。6. 查看作业状态python manage.py task-info --service_id xxx --task_id xxx指定服务ID和任务ID,查看作业状态,运行成功后,可以登录OBS服务进入相关的目录查看推理结果。作业运行失败时,当前暂未提供查询作业日志的功能,请提工单联系客服进行处理。
  • [其他] ModelArts应用开发
    准备模型应用开发的前序步骤是模型训练,因此开始进行应用开发时,您已经有训练优化好的可使用的模型了。当前ModelBox GPU镜像支持的模型类型有TensorRT和PyTorch模型,具体的版本号在您创建开发环境选择镜像时镜像名称中可以看到。如果您的模型不是TensorRT和PyTorch模型,需要重新训练成这两种引擎的模型或者将模型转换后再继续,推荐使用TensorRT模型。TensorRT 7.1的模型转换请参考官方指导和样例。如果您的模型在OBS存储,可在当前工程中根目录下创建下载脚本。在工程空白处右键单击“New File”,创建“obs_download.py”,写入内容:from modelarts.session import Sessionsession = Session()session.obs.download_dir(src_obs_dir="obs://bucket/dir/", dst_local_dir="/home/ma-user/work/model/")其中“src_obs_dir”替换成自己的obs桶目录地址,“dst_local_dir”替换成本地目录地址,然后在Terminal执行脚本即可完成下载:python obs_download.py如果您的模型在本地,则直接将文件拖拽到工程中对应的目录下,等待VSCode下方的上传进度执行完即可。创建solution应用开发可以将样例solution的代码拷贝修改,或者使用命令行工具创建新的空模板目录编写代码。方式一:拷贝已有solution并修改目录名称cp -r src/traffic src/example方式二:使用命令行创建空白solutionpython manage.py create-solution -n example 执行上述命令创建名为“example”的solution,创建好的目录中包含“flowunit”和“graph”两个文件夹以及“CMakeLists.txt”文件。开发流程图流程图(Graph)是应用逻辑的表述,ModelBox将根据流程图构建应用的处理逻辑,因此在应用开发中,流程图的开发是首要进行的,流程图开发完毕后,才能明确需要开发的功能单元。图文件为graph目录下的toml文件。流程图的格式如下,编写时可参考样例中的“src/traffic/graph/vehicle_detection/vehicle_detection.toml”,关于图的编写语法可以查看Graphviz DOT的指导。[driver]dir = ["build/drivers"] #指定功能单元等驱动加载路径,可以指定多个,逗号分隔,编译后的功能单元位于build/drivers[log]level="INFO"[flow]desc = "example" [graph]format = "graphviz" #流程图的格式,目前仅支持graphvizgraphconf = '''digraph example { node [shape=Mrecord] queue_size = 32 batch_size = 1 # 在此处编写自己的流程图 }'''开发功能单元功能单元的类型有三种:cpp/python/infer,分别对应c++开发的功能单元、python开发的功能单元、以及推理功能单元。推理功能单元使用如下命令创建推理功能单元:python manage.py create-flowunit -t infer -n infer -d src/example/flowunit/其中参数的含义如下。-t:flowunit类型,有cpp/infer/python三种类型。-n: flowunit的名称。-d:flowunit在的路径,此处设置为刚创建的“example/flowunit/”。在开发推理功能单元时,只需要提供独立的toml配置文件,指定推理功能单元的基本属性即可,其目录结构为:[some-flowunit] |---[some-flowunit].toml // 配置文件 |---[model].engine // 模型文件编写时可以参考样例中的推理功能单元:src/traffic/flowunit/vehicle_inference。cpp/python功能单元这里以cpp功能单元为例,使用如下命令创建cpp功能单元:python manage.py create-flowunit -t cpp -n Hello -d src/example/flowunit/创建好后,可以进行功能单元的开发。
  • [算子编译] 报错 raise ValueError("The checkpoint file does not exist.")
    【功能模块】mindspore 1.3【操作步骤&问题现象】1、我尝试在modelarts上运行yolov3_darknet53,我从gitee上下载了官方文件并在modelarts上创建训练作业,但是运行时报错;2、我在obs里是放了backbone_darknet53.ckpt,还是报错;config里我是这样写的enable_modelarts: True# Url for modelartsdata_url: "yolov3/data/"train_url: "yolov3/codev3_da/train.py"checkpoint_url: "s3://xunlian-f74d/yolov3/pretrain/"# Path for localdata_path: "/cache/data"output_path: "/cache/train"load_path: "/cache/checkpoint_path"device_target: "Ascend" # ['Ascend', 'GPU']need_modelarts_dataset_unzip: Truemodelarts_dataset_unzip_name: "train"# ==============================================================================# Training options# dataset relateddata_dir: "/cache/data/"per_batch_size: 32# network relatedpretrained_backbone: "/cache/checkpoint_path/0-320_102400.ckpt"resume_yolov3: ""第一次发帖,有什么问题望专家指正;【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] ModelArts将自动学习旧版项目升级到新版
    自动学习功能升级为新版,如果您的项目是在旧版中创建,需升级后再使用。未升级的自动学习项目,无法进行数据标注、训练以及部署等操作。说明:预测分析”类型的项目,可以不执行升级,直接使用新版自动学习。升级到新版登录ModelArts管理控制台,在左侧菜单栏中选择“自动学习”,进入“自动学习”项目列表页面。查找您的旧版项目。在“自动学习”列表中,如果项目是旧版的,在项目名称处带有标识,针对此类项目,单击操作列的“升级”。如果您的项目是新版的,则操作列中不存在“升级”按钮。图1 查找旧版项目在弹出的对话框中,设置需保存的“数据集名称”,以及数据集“存储路径”,然后单击“确定”启动升级。图2 升级项目等待项目升级,大概几分钟之后,项目将被升级为新版,项目名称处不再有旧版标识,且操作列不再存在“升级”按钮。
总条数:1606 到第
上滑加载中