-
案例介绍本案例面向学生及学生家长,面对学生成绩问题,借助大模型AI给出准确的建议及学习方向,做到让学生有方向,有目的,有次序的学习。 案例内容一、概述1. 案例介绍本案例开发一个给学生成绩提建议的系统,通过学生成绩加大模型分析,给出合理的学习建议。通过实际操作,了解如何利用Astro低代码平台开发应用。在这个过程中,学习从模型集成、界面操作、页面布置到逻辑实现以及应用打包一系列关键步骤,从而掌握Astro低代码平台的基本使用方法及于大模型的结合,体验其在应用开发中的优势。开发者空间Astro低代码开发平台通过平台提供的界面、逻辑、对象等可视化编排工具,以“拖、拉、拽”的方式来快速构建应用,从而实现所见即所得的应用开发构建体验。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。ModelArts Studio(MaaS)平台:是华为云推出的一款大模型即服务平台,可以一站式的对业界主流开源大模型进行部署托管,同时开放大模型API服务,可以结合业界主流Agent开发框架,轻松构建AI Agent应用。2. 适用对象企业个人开发者高校学生3. 案例时间本案例总时长预计90分钟。4. 案例流程说明:领取华为开发者空间,登录华为开发者空间-低代码应用开发平台;新建低代码应用,进入Astro轻应用服务控制台主页,开发应用;5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)MaaS 平台商用模型DeepSeek-R1 轻量体验包(¥7.00)/ DeepSeek-V3 轻量体验包(¥3.50)领券免费90华为开发者空间 - 低代码应用开发平台系统标配免费90二、案例准备新建Astro低代码应用 选择标准应用创建 配置应用名字 建立标准界面 数据对象建立 配置一个学生成绩对象 对学生成绩对象进行编辑 添加语文字段 添加数学字段 添加外语字段 添加历史字段 添加生物字段 添加化学字段 添加建议字段 结构体创建AImessage 建立起结构体AImessage用于后续大模型AI调用 界面创建1 创建学生分数统计界面并拖入表单 表单与对象模型建立连接 新建相关模型scoreData 配置相关模型 完成模型新增 选择相关模型 拖入表单标题 配置姓名输入框 姓名字段与数据模型中的name绑定 新增语文及其他科目,绑定方式与姓名相同 拖入相关容器用于容纳提交按钮 为按钮添加相关事件 javascript代码需要自行编写,可参考下面,该代码包含json数据处理,大模型提示词生成,新界面调用等 var _form = context.$component.form;var validFlag = _form.formValidateUnPromise();if (!validFlag) return false;// 序列化表单数据var model = context.$model.ref("scoreData").getData();var modelCopy = JSON.parse(JSON.stringify(model));// 处理非字符串字段Object.keys(modelCopy).forEach(item => { if (modelCopy[item] && typeof modelCopy[item] !== "string") { modelCopy[item] = JSON.stringify(modelCopy[item]); }});// 提取问题字段值var questionCodes = [];var subjects = ["name","yuwen", "shuxue", "waiyu", "lishi", "shengwu", "huaxue"];subjects.forEach(function(subject) { var fieldName = "feng_123__" + subject + "__CST"; questionCodes.push(modelCopy[fieldName] || "");});// 构建提示文本var suggestionText = `学生${questionCodes[0]}的各科成绩如下:- 语文:${questionCodes[1]}/150分- 数学:${questionCodes[2]}/150分 - 外语:${questionCodes[3]}/150分- 历史:${questionCodes[4]}/100分- 生物:${questionCodes[5]}/100分- 化学:${questionCodes[6]}/100分请根据以上成绩情况分析该学生的学习特点,并给出针对性的学习建议,200字以内。`.replace(/"/g, "'");//modelCopy.Astro_Test__questionCode7__CST = suggestionText;// 初始化Flowvar _flow = context.flow("feng_123__process");// 调用AI服务获取建议try { // 提示信息 context.$message.info("信息分析中,正在生成建议。。。。。。"); const resp = await _flow.run({ input: suggestionText }); const reader = resp.body.getReader(); const decoder = new TextDecoder(); let buffer = ''; let msg = ''; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value); const lines = buffer.split('\n'); // 保留最后一行(可能不完整) buffer = lines.pop() || ''; for (const line of lines) { if (!line.trim()) continue; try { const jsonStr = line.startsWith('data: ') ? line.substring(6) : line; if (jsonStr.trim() === '[DONE]') continue; const obj = JSON.parse(jsonStr); const newMsg = obj?.choices[0]?.delta?.content || ''; if (newMsg) msg += newMsg; } catch (err) { console.warn('解析JSON失败,保留到下一轮处理:', err.message); buffer = line + '\n' + buffer; } } } // 最终保存结果 modelCopy.feng_123__suggestions__CST = msg; context.$model.ref("scoreData").setData(modelCopy); // 提交数据 const saveResult = await context.$model.ref("scoreData").save(); if (saveResult.resCode == 0) { const recordId = saveResult.result[0]?.id; if (recordId) { context.$page.loadStdPage('feng_123__result', "recordId=" + recordId); // 成功消息 context.$message.success('生成成功'); } }} catch (error) { console.error("AI服务调用失败:", error); // 可以添加错误处理逻辑,如显示错误信息} 大模型连接器建立点击集成、连接器实例、MaaS云平台、取名为feng_123__ai,模型名称填写DeepSeek-V3,及相关API key 大模型可用性测试 经测试可以正常运行 建立新的服务编排(后台) 创建新的服务编排 依次拖入赋值及刚创建的大模型 配置输入输出变量 配置出参、入参 赋值模块配置 大模型连接器配置 配置相关大模型参数 按顺序进行保存 界面创建2-Result 填写表单 同样引入模型 选择相关对象 拖入输入框 把输入框进行数据绑定绑定相关事件 同样的,采用Javascript读取对象的返回值,js代码需自行编写// json化方法function parseJSON(str) { var flag = false; try { JSON.parse(str); flag = true } catch (err) { flag = false; } return flag;}console.log('start')var recordId = context.$page.params.recordId;if (!recordId) return;console.log('middle')try { // 获取Object对象 var _object = context.object('feng_123__StudentScore__CST'); console.log(_object) // 查询满足条件数据 var _condition = { conjunction: 'AND', conditions: [{ field: 'id', operator: 'eq', value: recordId }] }; const res = await _object.query(_condition); if (res.resCode !== '0' || !res.result || res.result.length === 0) return; const data = res.result[0]; // 解析JSON字符串字段 Object.keys(data).forEach(item => { if (data[item] && parseJSON(data[item])) { try { const parsed = JSON.parse(data[item]); data[item] = parsed; } catch (e) { // 不是有效JSON,保持原值 } } }); $model.ref("resultForm").setData(data);} catch (err) { console.error("数据查询或处理失败:", err);} 测试阶段点击下图中预览 输入相关内容 大模型会对数据进行分析并返回相关建议 文章不支持zip格式的安装包上传,放在网盘里了链接: https://yun.139.com/shareweb/#/w/i/2qidE2NWWtzrd 提取码:459x 我正在参加【案例共创】第7期 基于MaaS商用服务 + 华为开发者空间 - Astro 低代码开发平台构建低代码应用 cid:link_2
-
体验华为开发者空间《【案例共创】华为开发者空间云开发环境 x DeepSeek打造全链路高效数据分析工作流》案例,反馈改进建议,请直接在评论区反馈即可。体验指导:https://devstation.connect.huaweicloud.com/space/devportal/casecenter/1476b44e28e84471b95a8c43753d2d79/1
-
体验华为开发者空间《华为开发者空间开发平台-云开发环境(容器)操作指导》案例,反馈改进建议,请直接在评论区反馈即可。体验指导:https://devstation.connect.huaweicloud.com/space/devportal/casecenter/1476b44e28e84471b95a8c43753d2d79/1
-
案例介绍2025年高考报名人数突破1300万,大部分学生在院校档次与专业兴趣的取舍焦虑,全国3005所高校、792个本科专业构成的选择矩阵远超个体认知负荷本案例开发一个大学择校推荐系统,根据学生成绩,专业兴趣,地域爱好等,基于人工智能大模型DeepSeek生成推荐的大学院校,帮助万千学子提供择校参考 案例内容一、概述1. 案例介绍本案例开发一个大学择校推荐系统,根据学生成绩,专业兴趣,地域爱好等,基于人工智能大模型DeepSeek生成推荐的大学院校通过实际操作,了解如何利用Astro低代码平台开发应用。在这个过程中,学习从模型集成、界面操作、页面布置到逻辑实现以及应用打包一系列关键步骤,从而掌握Astro低代码平台的基本使用方法及于大模型的结合,体验其在应用开发中的优势。开发者空间Astro低代码开发平台通过平台提供的界面、逻辑、对象等可视化编排工具,以“拖、拉、拽”的方式来快速构建应用,从而实现所见即所得的应用开发构建体验。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。ModelArts Studio(MaaS)平台:是华为云推出的一款大模型即服务平台,可以一站式的对业界主流开源大模型进行部署托管,同时开放大模型API服务,可以结合业界主流Agent开发框架,轻松构建AI Agent应用。2. 适用对象企业个人开发者高校学生3. 案例时间本案例总时长预计90分钟。4. 案例流程说明:领取华为开发者空间,登录华为开发者空间-低代码应用开发平台;新建低代码应用,进入Astro轻应用服务控制台主页,开发应用;5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)MaaS 平台商用模型DeepSeek-R1 轻量体验包(¥7.00)/ DeepSeek-V3 轻量体验包(¥3.50)领券免费90华为开发者空间 - 低代码应用开发平台系统标配免费90二、案例准备1、设计对象字段低代码平台中的对象(也可以称为Object)相当于传统方式开发业务系统时,数据库中创建的一个表。每个对象对应一张数据库表,用于保存业务系统需要的配置数据和业务数据。本用例会使用到对象来存储数据,建议提前设计好对象字段,避免后续手忙脚乱字段名称唯一标识字段类型字段说明大学择校推荐tuijian文本区用于返回推荐结果高考省份shengfen文本高考省份和文理科高考分数fenshu数字高考的分数兴趣与能力xingqu文本自身的兴趣爱好或者有哪方面的能力学校性质 xingzhi文本想选择的学校性质如本科专科性别xingbie文本性别,更好的结合性别来推荐学校希望就读城市或者地域chengshi文本希望就读的城市或地域 2、开通ModelArts Studio(MaaS)商用百万Token活动连接:每周畅领100万商用级Tokens!基于CloudMatrix384超节点,Token时延低、TPM/RPM速率高,助您开发商用级AI应用!商用百万Token代金券免费领取链接(可每周领取):DeepSeek-R1/V3-64K百万tokens代金券:cid:link_22.1、大模型领取:切换到开发者空间首页,或者点击上面连接,参与活动“百万商用服务tokens免费领!”活动,按照使用说明进行服务开通:活动页面:2.2、开通完成后,进行大模型的接入:ModelArts控制台:ModelArts - Console模型部署页:部署页面,点击调用按钮,进入调用页面,这里我们提前保存好Api地址和模型名称,点击API调用说明:2.3、创建apikey点击前往API Key管理创建apikey,点击新建创建apikey注意!!创建好API Key之后,点击后面的复制按钮,妥善保存,若未复制保存,后续无法重新复制获取。 三、华为开发者空间-低代码应用开发平台开发应用1. 登录华为开发者空间-低代码应用开发平台华为开发者空间-低代码应用开发平台是华为云推出的一款可视化应用开发平台,旨在通过"拖拽式"组件和模板化设计,降低开发门槛,提升企业数字化应用构建效率。平台主要特点包括:可视化开发:通过图形化界面和预置组件,无需编写复杂代码即可快速搭建应用;全场景支持:覆盖Web、移动端、大屏等多终端应用开发;高效集成:内置连接器可快速对接华为云及其他主流企业系统;智能辅助:提供AI辅助开发能力,如智能表单生成、流程自动化等;企业级能力:具备权限管理、数据安全、高可用等企业所需特性。Astro平台特别适合业务人员与开发者协同创新,能大幅缩短应用交付周期,典型适用于OA审批、数据看板、轻量级业务系统等场景。登录华为开发者空间,在左侧菜单列表选择华为开发者空间 -> 开发平台 -> Astro 低代码开发,进入华为开发者空间-低代码应用开发平台。2. 创建低代码应用2.1、华为开发者空间-低代码应用开发平台页面点击新建低代码应用,在弹出的新建低代码应用对话框中,选择标准应用,点击确定按钮。 注:命名空间为租户数据唯一标识,为免重复,首次创建或使用工程时需定义命名空间。请务必慎重,一旦定义,不可修改,推荐使用公司前缀。本案例中使用xiaowuyun作为命名空间。2.2、在右侧弹出的新建空白应用配置页签中,配置应用名称和标签均为university。2.3、点击右下角确认按钮,平台会自动打开一个新的页面:Astro轻应用服务控制台。注:在点击确认后,在Astro轻应用管理页会同时新增一条刚才创建的名称为xxxx__university的应用,点击编辑同样可以进入Astro轻应用服务控制台。 3. 集成连接器大模型将外部接口集成zero并编写编排流程:在应用中,点击左侧集成 - 连接器实例 - 大模型 - MaaS云平台:点击右上角加号,创建自定义连接器,输入标“标签”(这里为ds,可自定义)、“名称”(这里填入MaaS,可自定义)、“模型名称”(前步保存的模型名称)和“APIKey”(前步保存的apiKey);点击保存:测试连通性,点击“测试”,在弹出框中输入测试内容后,点击测试等待返回结果,正常返回说明添加成功:4. 添加对象和全局结构体4.1、创建大学推荐记录对象进入大学推荐系统设计器界面,在左侧导航栏中,选择“数据”;单击对象后的“新建对象”图标,进入创建新对象页面;设置对象基本信息:填写对象名称为“大学择校推荐系统”,唯一标识为“university”,单击“确定”按钮。4.2、创建字段4.2.1、 单击对象中的编辑图标,进入对象详情页:4.2.2 点击“添加”,添加字段:显示名称“高考省份”,唯一标识:“shengfen”,点击字段类型,选择“文本”类型,点击“确定”:4.2.3 、相同的操作,添加显示名称“大学择校推荐 ”,唯一标识“tuijian”,类型“文本区”:参考如让步骤,把案例准备设计的字段全部创建,添加完如下图字段名称唯一标识字段类型字段说明大学择校推荐tuijian文本区用于返回推荐结果高考省份shengfen文本高考省份和文理科高考分数fenshu数字高考的分数兴趣与能力xingqu文本自身的兴趣爱好或者有哪方面的能力学校性质 xingzhi文本想选择的学校性质如本科专科性别xingbie文本性别,更好的结合性别来推荐学校希望就读城市或者地域chengshi文本希望就读的城市或地域4.3、创建全局结构体:4.3.1、 点击左侧菜单栏数据,选择结构体新增,输入名称和唯一标识(可自定义,这里选择message为例),创建结构体4.3.2、创建完成后点击结构,选择结构体编辑按钮,添加的字段新增role和content,保存:5. 开发推荐系统页面5.1、创建系统页面在新版应用设计器的“界面”中,单击页面后的添加图标,设置页面标签为“大学择校推荐”、名称为“university”,单击“添加”,即可创建一个标准页面:5.2、添加并设置表单从左侧“组件”区域,将“表单”组件拖拽到页面中间,元数据表单配置向导点击“取消”:设置表单属性:如设置布局为宽“800px”和高“1024px”、居中对齐,设置字体大小为“16px”、行高为“23”等。(可自定义)设置数据绑定,点击数据绑定后的“设置”图标,点击“新增模型”:设置模型名称为“formData”,来源选择“对象”,单击“下一步””选择对象”下拉框选择“大学择校推荐系统(xxx__university__CST)”,“选择字段”勾选全部字段,单击“下一步”:单击“确定”:勾选“formData”,单击“确定”:注:在弹出框中,选择“只绑定模型”5.3、添加大标题。从左侧“组件”区域,将“标题”组件拖拽到表单中间:设置标题属性:点击标题,在右侧菜单栏点击基本属性,设置标题内容为“大学择校推荐系统”:点击下方字体,如设置字体颜色为“#147AEC”、字体大小为“28px”、上下间距为“50”、位置为“center”。(可自定义)当前配置会生成对应的css样式,可以查看高级设置(无具体操作,供查看学习使用)。5.4、添加图片5.4.1、从左侧“组件”区域,将“图片”组件拖拽到标题下方:5.4.2、设置图片属性:单击“图片地址”后的“选择图片”图标,在选择图片界面,选中一张图片,单击“确定”,或者单击“上传图片”按钮,从本地电脑中选择一张图片上传即可:5.4.3 设置图片宽度为“100%”注:选择或上传图片,支持上传JPG、JPEG、PNG和GIF格式的图片,图片大小不超过1MB5.5、设置小标题参考步骤5.3,设置小标题,设置标题内容为“帮你解决高考志愿填报的难题,填写你的信息,我会尽力为你提供帮助,让我们一起为你的未来规划加油吧!”(可自定义),标题类型为“Hending2”;5.6、添加采集项15.6.1、在标准页面设计界面,从“基本组件 > 表单”中,拖拽“输入框”组件至表单工作区域:点击基本属性,设置标签内容输入“1、高考省份”,在表单校验中,打开必填开关,设置必填错误信息为“请输入你的高考省份”5.6.2、设置输入框属性:点击输入框,点击右侧菜单栏“数据绑定”中的“设置”图标,勾选“xxxx__shengfen__CST”,单击“确定”:注意:数据绑定时要跟自己设计的对象字段名称一一对应5.7、添加采集项2同上:从“基本组件 > 表单”中,拖拽“输入框”组件至表单工作区域:点击基本属性,设置标签内容输入“2、高考分数”,在表单校验中,打开必填开关,设置必填错误信息为“请输入你的高考分数”点击数据绑定中的设置图标,勾选“xxx__fenshu__CST”,单击“确定”。 5.8、添加采集项3同上:从“基本组件 > 表单”中,拖拽“输入框”组件至表单工作区域:点击基本属性,设置标签内容输入“3、兴趣能力”,点击数据绑定中的设置图标,勾选“xxx__xingqu_CST”,单击“确定5.9、添加采集项4同上:从“基本组件 > 表单”中,拖拽“复选按钮”组件至表单工作区域:点击基本属性,设置标签内容输入“4、学校性质(可选多个)”,设置选项如图,点击数据绑定中的设置图标,勾选“xxx__xingzhi_CST”,单击“确定5.10、添加采集项5在标准页面设计界面,从“基本组件 - 表单”中,拖拽“单选按钮”组件至表单工作区域。设置单选按钮属性。设置标签为“5,性别”,选项为“男 - 男”和“女 - 女”,点击数据绑定中的设置图标,勾选“xxx__xingbie_CST”,单击“确定5.11、添加采集项6同上:从“基本组件 > 表单”中,拖拽“输入框”组件至表单工作区域:点击基本属性,设置标签内容输入“6、希望就读城市或地域”,点击数据绑定中的设置图标,勾选“xxx__chengshi_CST”,单击“确定5.12、添加容器在标准页面设计界面,从“基本组件 > 布局”中,拖拽“容器”组件至表单工作区域。5.13、添加提交按钮:在标准页面设计界面,从“基本组件 > 基本”中,拖拽“按钮”组件至容器区域:5.13.1设置按钮属性:设置显示名称为“提交”,大小选择“默认”。5.13.2、设置按钮事件:首先切换到“事件”标签,单击加号,在“添加动作 > 自定义动作(名称可自定义) > 动作名称”代码区域中,输入代码,单击“创建”。粘贴代码后点击保存代码部分如下:其中代码中formData在步骤《5.2、添加并设置表单:》中创建的对象模型名称xiaowuyun_ds是步骤《3. 集成连接器大模型》绑定的MaaS大模型的实例连接器定义的标签,xiaowuyun__xxx_xxx的字段名前面的部分需要更改为用户自己的命名空间。其他对应修改,可参考如下完整代码####注释的部分// 表单校验var _form = context.$component.form;var validFlag = _form.formValidateUnPromise();if (!validFlag) return false;// 序列化表单数据var model = context.$model.ref("formData").getData();var modelCopy = JSON.parse(JSON.stringify(model));// 处理非字符串字段Object.keys(modelCopy).forEach(item => { if (modelCopy[item] && typeof modelCopy[item] !== "string") { modelCopy[item] = JSON.stringify(modelCopy[item]); }});// 提取问题字段值var questionCodes = [];const arr = ['shengfen', 'fenshu', 'xingqu','xingzhi', 'xingbie', 'chengshi']; ####修改为自己定义的字段名称for (let i = 0; i < arr.length; i++) { var fieldName = "xiaowuyun__" + arr[i] + "__CST"; #####修改为自己的命名空间 questionCodes.push(modelCopy[fieldName] || "");}// 构建提示文本var suggestionText = `你是一个专业的大学推荐助手,该学生高考省份为 ${questionCodes[0]},高考分数是 ${questionCodes[1]}分,兴趣与能力是 ${questionCodes[2]},希望上的大学学校性质为:${questionCodes[3]},性别是 ${questionCodes[4]} 生,希望就读城市或者地域为 :${questionCodes[5]}。请根据以上信息给出该学生进行大学推荐,推荐内容包含大学的介绍和特色。`.replace(/"/g, "'");// 初始化Flowvar _flow = context.flow("xiaowuyun__ds"); #####修改为自己创建大模型集成器的名称// 调用AI服务获取建议try { // 提示信息 context.$message.info("信息分析中,正在生成建议。。。。。。"); const resp = await _flow.run({ input: suggestionText }); const reader = resp.body.getReader(); const decoder = new TextDecoder(); let buffer = ''; let msg = ''; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value); const lines = buffer.split('\n'); // 保留最后一行(可能不完整) buffer = lines.pop() || ''; for (const line of lines) { if (!line.trim()) continue; try { const jsonStr = line.startsWith('data: ') ? line.substring(6) : line; if (jsonStr.trim() === '[DONE]') continue; const obj = JSON.parse(jsonStr); const newMsg = obj?.choices[0]?.delta?.content || ''; if (newMsg) msg += newMsg; } catch (err) { console.warn('解析JSON失败,保留到下一轮处理:', err.message); buffer = line + '\n' + buffer; } } } // 最终保存结果 modelCopy.xiaowuyun__tuijian__CST = msg; #### ####修改为自己命名空间和定义的字段名称 context.$model.ref("formData").setData(modelCopy); // 提交数据 const saveResult = await context.$model.ref("formData").save(); if (saveResult.resCode == 0) { const recordId = saveResult.result[0]?.id; if (recordId) { context.$page.loadStdPage('xiaowuyun__suggestion', "recordId=" + recordId); // 成功消息 context.$message.success('生成成功'); } }} catch (error) { console.error("AI服务调用失败:", error); // 可以添加错误处理逻辑,如显示错误信息}6、添加逻辑编排6.1、添加服务编排点击左侧逻辑 - 编排 - 新建编排,名称填ds,模板类型默认,点击添加:6.2、新增变量点击右侧“全局上下文”,新增变量,创建变量 - input,类型为文本:创建变量 - output,类型为任意:6.3、新增对象变量创建对象变量 - messages,使用步骤3中创建的全局结构体,选择数组:6.4、添加配置开始图元点击画布上的开始图元,点击参数,将刚才创建的变量分别拖进入参和出参:6.5、添加配置赋值图元选择左侧赋值图元,拖入界面,并将开始图元与赋值图元连接:选择赋值图元,点击赋值按钮,将变量赋值,第一行为刚才的全局结构体变量名称“messages[0].role”,我们将值设置为"user"(要用英文双引号),第二行为全局结构体变量名称“messages[0].content”,变量值可直接将变量中的input拖入:6.6、添加配置连接器图元左侧选择连接器 - 自定义连接器,选择前面步骤我们创建的连接器。将其拖拽进页面,并将赋值图元与连接图元连接:点击连接器图元,点击基本信息,选中步骤《3. 集成连接器大模型》创建的大模型连接器:选择连接器按钮,将连接器的入参message为对象变量message拖拽入,输出参数result为变量output拖拽:注意:此处可以多试几次,动作有时候显示不出来6.7、保存测试编排点击保存,启用,运行测试:输入参数{"input":"我要上大学"},测试看是否成功,参数内容可以自定义,最好简单一些防止运行时间过久:7. 开发结果推荐页面7.1、添加页面点击导航栏界面,选择+号新建页面:输入标签"推荐"和名称"suggestion",点击添加:7.2、设置表单仿照步骤《5.2、添加并设置表单》界面格式,进行页面设置,从左侧组件栏将表单组件拖拽至页面,元数据表单配置向导点击取消,属性设置布局:宽800px,高1024px,居中。(设置可根据自己需要自定义):7.3、数据绑定点击属性 - 数据绑定 - 新增模型:按前述步骤设置模型名称为"form0",选择来源为对象:点击下一步,选择"大学择校推荐系统"并勾选所有字段:点击下一步,点击确定:选择刚创建好的模型,点击确定,选择只绑定模型:7.4、添加图片参考步骤《5.4、添加图片》,添加图片;7.5、添加多行输入框在标准页面设计界面,从“基本组件 - 表单”中,拖拽“多行输入框”组件至表单工作区域,点击数据绑定中的设置图标,勾选“XXX__suggestion__CS”,单击“确定标签 填入 根据您提供的信息,有如下推荐,预祝你选上心仪的大学;高度 - 自适应高度,其余参考下图;点击页面,创建自定义脚本,写入以下代码点击保存其中“xiaowuyun_xx_xx”类的字段需更换为自身的命名空间:修改为自己创建的命名空间和对象名称,对象名称为步骤《4.1、创建大学推荐记录对象》创建的对象名称 var _object = context.object('xiaowuyun__university__CST'); 完整代码如下:// json化方法function parseJSON(str) { var flag = false; try { JSON.parse(str); flag = true } catch (err) { flag = false; } return flag;}var recordId = context.$page.params.recordId;if (!recordId) return;try { // 获取Object对象 var _object = context.object('xiaowuyun__university__CST'); ####修改为自己创建的命名空间和对象名称 // 查询满足条件数据 var _condition = { conjunction: 'AND', conditions: [{ field: 'id', operator: 'eq', value: recordId }] }; const res = await _object.query(_condition); if (res.resCode !== '0' || !res.result || res.result.length === 0) return; const data = res.result[0]; // 解析JSON字符串字段 Object.keys(data).forEach(item => { if (data[item] && parseJSON(data[item])) { try { const parsed = JSON.parse(data[item]); data[item] = parsed; } catch (e) { // 不是有效JSON,保持原值 } } }); $model.ref("form0").setData(data);} catch (err) { console.error("数据查询或处理失败:", err);}8. 页面效果测试预览填报界面,进行功能调试、测试验证:点击页面左上角的预览图标如遇异常可以在数据-对象-对应对象数据里看到采集到的数据点击预览图标后会跳转大学推荐系统应用,然后填写大学推荐应用参数;提交完成时后跳转大学推荐页面; 至此案例结束,案例整体步骤比较多,后续各种调用其实都是根据定义名称来的,一定要先梳理好对象的命名规划,还有大模型、对象名称等要制定好,避免后续名字乱不好调用我正在参加【案例共创】第7期 基于MaaS商用服务 + 华为开发者空间 - Astro 低代码开发平台构建低代码应用 cid:link_3
-
华为云开发者空间基于昇腾NPU实现CT肺炎影像分割模型训练与推理本案例将介绍如何在华为云开发者空间的AI Notebook环境中,利用昇腾NPU 910B4硬件资源训练和推理一个用于CT肺炎影像分割的深度学习模型,涵盖从数据准备、预处理、模型构建、训练到推理可视化的完整深度学习工作流。首先,从OBS存储桶下载并解压了COVID-19 CT扫描数据集,该数据集包含原始CT扫描图像、肺部掩码、感染区域掩码以及肺部和感染区域的组合掩码。import os import zipfile # 下载数据集 if not os.path.exists('Covid-19.zip'): os.system('wget -q https://orangepi-ai-studio.obs.cn-north-4.myhuaweicloud.com/Covid-19.zip') # 解压数据集 if not os.path.exists('Covid-19'): zip_file = zipfile.ZipFile('Covid-19.zip') zip_file.extractall() zip_file.close() 读取数据集中的元数据并显示前5行:import pandas as pd data = pd.read_csv('Covid-19/metadata.csv') data.head() ct_scanlung_maskinfection_masklung_and_infection_mask0…/input/covid19-ct-scans/ct_scans/coronacases……/input/covid19-ct-scans/lung_mask/coronacase……/input/covid19-ct-scans/infection_mask/coron……/input/covid19-ct-scans/lung_and_infection_m…1…/input/covid19-ct-scans/ct_scans/coronacases……/input/covid19-ct-scans/lung_mask/coronacase……/input/covid19-ct-scans/infection_mask/coron……/input/covid19-ct-scans/lung_and_infection_m…2…/input/covid19-ct-scans/ct_scans/coronacases……/input/covid19-ct-scans/lung_mask/coronacase……/input/covid19-ct-scans/infection_mask/coron……/input/covid19-ct-scans/lung_and_infection_m…3…/input/covid19-ct-scans/ct_scans/coronacases……/input/covid19-ct-scans/lung_mask/coronacase……/input/covid19-ct-scans/infection_mask/coron……/input/covid19-ct-scans/lung_and_infection_m…4…/input/covid19-ct-scans/ct_scans/coronacases……/input/covid19-ct-scans/lung_mask/coronacase……/input/covid19-ct-scans/infection_mask/coron……/input/covid19-ct-scans/lung_and_infection_m…我们分别获取原始图像、肺部mask、感染mask、肺部和感染mask的文件路径:# 原始图像 ct_scan_sample_file = data.loc[0,'ct_scan'].replace('../input/covid19-ct-scans','Covid-19') # 肺部mask lung_mask_sample_file = data.loc[0,'lung_mask'].replace('../input/covid19-ct-scans','Covid-19') # 感染mask infection_mask_sample_file = data.loc[0,'infection_mask'].replace('../input/covid19-ct-scans','Covid-19') # 肺部和感染mask lung_and_infection_mask_sample_file = data.loc[0,'lung_and_infection_mask'].replace('../input/covid19-ct-scans','Covid-19') 安装nibabel库读取NIfTI格式的医学影像文件,使用matplotlib库进行可视化展示:!pip install nibabelimport numpy as np import nibabel as nib # 读取nifti文件 def read_nii_file(fileName): img = nib.load(fileName) img_data = img.get_fdata() img_data = np.rot90(np.array(img_data)) return img_data # 读取 ct_scan_imgs = read_nii_file(ct_scan_sample_file) lung_mas_imgs = read_nii_file(lung_mask_sample_file) infection_mask_imgs = read_nii_file(infection_mask_sample_file) lung_and_infection_mas_imgs = read_nii_file(lung_and_infection_mask_sample_file) # 查看大小 print(ct_scan_imgs.shape) print(lung_mas_imgs.shape) (512, 512, 301) (512, 512, 301) # 绘制 import matplotlib.pyplot as plt %matplotlib inline color_map = 'spring' layer_index = 180 fig = plt.figure(figsize=(20, 4)) plt.subplot(1, 4, 1) plt.imshow(ct_scan_imgs[:,:,layer_index], cmap='bone') plt.title('Original Image') plt.axis('off') plt.subplot(1,4,2) plt.imshow(ct_scan_imgs[:,:,layer_index], cmap='bone') mask_ = np.ma.masked_where(lung_mas_imgs[:,:,layer_index]== 0, lung_mas_imgs[:,:,layer_index]) plt.imshow(mask_, alpha=0.8, cmap=color_map) plt.title('Lung Mask') plt.axis('off') plt.subplot(1,4,3) plt.imshow(ct_scan_imgs[:,:,layer_index], cmap='bone') mask_ = np.ma.masked_where(infection_mask_imgs[:,:,layer_index]== 0, infection_mask_imgs[:,:,layer_index]) plt.imshow(mask_, alpha=0.8, cmap=color_map) plt.title('Infection Mask') plt.axis('off') plt.subplot(1,4,4) plt.imshow(ct_scan_imgs[:,:,layer_index], cmap='bone') mask_ = np.ma.masked_where(lung_and_infection_mas_imgs[:,:,layer_index]== 0, lung_and_infection_mas_imgs[:,:,layer_index]) plt.imshow(mask_, alpha=0.8, cmap=color_map) plt.title('Lung and Infection Mask') plt.axis('off') plt.show() 之后对数据进行标准化和归一化,划分训练集和测试集,并统一缩放到256x256的大小保存为npy文件。标准化x′=x−mean(x)σx'= \frac{x-mean(x)}{\sigma} x′=σx−mean(x)归一化x′=x−min(x)max(x)−min(x)x'= \frac{x-min(x)}{max(x)-min(x)} x′=max(x)−min(x)x−min(x)# 标准化 def standardize(data): # 计算均值 mean = data.mean() # 计算标准差 std = np.std(data) # 计算结果 standardized = (data - mean) / std return standardized # 归一化 def normalize(data): # 计算最大最小值 max_val = data.max() min_val = data.min() normalized = (data - min_val) / (max_val - min_val) return normalized std = standardize(ct_scan_imgs) normalize(std).max(),normalize(std).min() (1.0, 0.0) # 处理所有文件 import cv2 import glob train_file_list =[file_path.replace('../input/covid19-ct-scans','Covid-19') for file_path in data.loc[:,'ct_scan']] train_label_list = [file_path.replace('../input/covid19-ct-scans','Covid-19') for file_path in data.loc[:,'infection_mask']] train_file_list[:5], len(train_label_list), train_label_list[:5], len(train_file_list) (['Covid-19/ct_scans/coronacases_org_001.nii', 'Covid-19/ct_scans/coronacases_org_002.nii', 'Covid-19/ct_scans/coronacases_org_003.nii', 'Covid-19/ct_scans/coronacases_org_004.nii', 'Covid-19/ct_scans/coronacases_org_005.nii'], 20, ['Covid-19/infection_mask/coronacases_001.nii', 'Covid-19/infection_mask/coronacases_002.nii', 'Covid-19/infection_mask/coronacases_003.nii', 'Covid-19/infection_mask/coronacases_004.nii', 'Covid-19/infection_mask/coronacases_005.nii'], 20) from tqdm import tqdm for index in tqdm(range(len(train_file_list))): # 读取 img = nib.load(train_file_list[index]) mask = nib.load(train_label_list[index]) img_data = img.get_fdata() mask_data = mask.get_fdata().astype(np.uint8) # 标准化和归一化 std = standardize(img_data) normalized = normalize(std) # 分为训练数据和测试数据 if index < 17: save_dir = 'processed/train/' else: save_dir = 'processed/test/' # 遍历所有层,分层存入文件夹,存储路径格式:'processed/train/0/img_0.npy','processed/train/0/label_0.npy', layer_num = normalized.shape[-1] for i in range(layer_num): layer = normalized[:,:,i] mask = mask_data[:,:,i] # 缩放 layer = cv2.resize(layer, (256, 256)) mask = cv2.resize(mask, (256, 256), interpolation=cv2.INTER_NEAREST) # 创建文件夹 img_dir = save_dir + str(index) if not os.path.exists(img_dir): os.makedirs(img_dir) # 保存为npy文件 np.save(img_dir+'/img_'+str(i), layer) np.save(img_dir+'/label_'+str(i), mask) 100%|██████████| 20/20 [01:08<00:00, 3.44s/it] 同时采用imgaug库进行数据增强,包括图像的缩放、旋转和弹性变换等操作,以提升模型的泛化能力。!pip install imgaugimport imgaug as ia import imgaug.augmenters as iaa from torch.utils.data import Dataset from imgaug.augmentables.segmaps import SegmentationMapsOnImage class SegmentDataset(Dataset): def __init__(self,where='train',seq=None): # 获取数据 self.img_list = glob.glob('processed/{}/*/img_*'.format(where)) self.mask_list = glob.glob('processed/{}/*/img_*') # 数据增强pipeline self.seq = seq def __len__(self): # 返回数据大小 return len(self.img_list) def __getitem__(self, idx): # 获取具体每一个数据 # 获取图片 img_file = self.img_list[idx] mask_file = img_file.replace('img','label') img = np.load(img_file) # 获取mask mask = np.load(mask_file) # 如果需要数据增强 if self.seq: segmap = SegmentationMapsOnImage(mask, shape=mask.shape) img,mask = seq(image=img, segmentation_maps=segmap) # 直接获取数组内容 mask = mask.get_arr() # 灰度图扩张维度成张量 return np.expand_dims(img,0) , np.expand_dims(mask,0) # 数据增强处理流程 seq = iaa.Sequential([ iaa.Affine(scale=(0.8, 1.2), # 缩放 rotate=(-45, 45)), # 旋转 iaa.ElasticTransformation() # 变换 ]) 创建dataloader,开启8个线程一次加载16张图片进行处理。import torch import torch_npu from torch_npu.contrib import transfer_to_npu # 使用dataloader加载 batch_size = 16 num_workers = 8 train_dataset = SegmentDataset('train', seq) test_dataset = SegmentDataset('test', None) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, num_workers=num_workers, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, num_workers=num_workers, shuffle=False) 我们可以查看单张图像增强后的效果:# 对同一个图片显示多次 fig = plt.figure(figsize=(12, 12)) for i in range(16): plt.subplot(4, 4, i+1) img , mask = train_dataset[101] plt.imshow(img[0], cmap='bone') mask_ = np.ma.masked_where(mask[0]== 0, mask[0]) plt.imshow(mask_, alpha=0.8, cmap="spring") plt.axis('off') plt.show() 数据准备完成后,我们开始从头构建Unet的网络结构。U-Net是一种经典的编码器-解码器结构,特别适用于医学图像分割任务。网络包含四个编码层和四个解码层,通过跳跃连接将编码器的特征图与解码器对应层进行融合,保留了丰富的空间信息。# 定义两次卷积操作 class ConvBlock(torch.nn.Module): def __init__(self,in_channels,out_channels): super().__init__() self.step = torch.nn.Sequential( # 第一次卷积 torch.nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=3,padding=1,stride=1), # ReLU torch.nn.ReLU(), # 第二次卷积 torch.nn.Conv2d(in_channels=out_channels,out_channels=out_channels,kernel_size=3,padding=1,stride=1), # ReLU torch.nn.ReLU() ) def forward(self,x): return self.step(x) class UNet(torch.nn.Module): def __init__(self): super().__init__() # 定义左侧编码器的操作 self.layer1 = ConvBlock(1,64) self.layer2 = ConvBlock(64,128) self.layer3 = ConvBlock(128,256) self.layer4 = ConvBlock(256,512) # 定义右侧解码器的操作 self.layer5 = ConvBlock(256+512,256) self.layer6 = ConvBlock(128+256,128) self.layer7 = ConvBlock(64+128,64) #最后一个卷积 self.layer8 = torch.nn.Conv2d(in_channels=64,out_channels=1,kernel_size=1,padding=0,stride=1) # 定一些其他操作 # 池化 self.maxpool = torch.nn.MaxPool2d(kernel_size=2) #上采样 self.upsample = torch.nn.Upsample(scale_factor=2,mode='bilinear') # sigmoid self.sigmoid = torch.nn.Sigmoid() def forward(self,x): # 对输入数据进行处理 # 定义下采样部分 # input:1X256x256, output: 64x256x256 x1 = self.layer1(x) # input:64x256x256, output: 64 x 128 x 128 x1_p = self.maxpool(x1) # input: 64 x 128 x 128 , output: 128 x 128 x 128 x2 = self.layer2(x1_p) # input:128 x 128 x 128 , output: 128 x 64 x 64 x2_p = self.maxpool(x2) # input: 128 x 64 x 64, output: 256 x 64 x 64 x3 = self.layer3(x2_p) #input:256 x 64 x 64, output: 256 x 32 x 32 x3_p = self.maxpool(x3) #input: 256 x 32 x 32, output: 512 x 32 x 32 x4 = self.layer4(x3_p) # 定义上采样 # input: 512 x 32 x 32,output: 512 x 64 x 64 x5 = self.upsample(x4) # 拼接,output: 768x 64 x 64 x5 = torch.cat([x5,x3],dim=1) # input: 768x 64 x 64,output: 256 x 64 x 64 x5 = self.layer5(x5) # input: 256 x 64 x 64,output: 256 x 128 x 128 x6 = self.upsample(x5) # 拼接,output: 384 x 128 x 128 x6 = torch.cat([x6,x2],dim=1) # input: 384 x 128 x 128, output: 128 x 128 x 128 x6 = self.layer6(x6) # input:128 x 128 x 128, output: 128 x 256 x 256 x7 = self.upsample(x6) # 拼接, output: 192 x 256 x256 x7 = torch.cat([x7,x1],dim=1) # input: 192 x 256 x256, output: 64 x 256 x 256 x7 = self.layer7(x7) # 最后一次卷积,input: 64 x 256 x 256, output: 1 x 256 x 256 x8 = self.layer8(x7) #sigmoid # x9= self.sigmoid(x8) return x8网络定义完成后我们可以安装torchsummary库将搭建好的模型可视化。!pip install torchsummary# 模型架构可视化 from torchsummary import summary # device device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model = UNet().to(device) summary(model,(1, 256, 256)) [W compiler_depend.ts:623] Warning: expandable_segments currently defaults to false. You can enable this feature by `export PYTORCH_NPU_ALLOC_CONF = expandable_segments:True`. (function operator()) ---------------------------------------------------------------- Layer (type) Output Shape Param # ================================================================ Conv2d-1 [-1, 64, 256, 256] 640 ReLU-2 [-1, 64, 256, 256] 0 Conv2d-3 [-1, 64, 256, 256] 36,928 ReLU-4 [-1, 64, 256, 256] 0 ConvBlock-5 [-1, 64, 256, 256] 0 MaxPool2d-6 [-1, 64, 128, 128] 0 Conv2d-7 [-1, 128, 128, 128] 73,856 ReLU-8 [-1, 128, 128, 128] 0 Conv2d-9 [-1, 128, 128, 128] 147,584 ReLU-10 [-1, 128, 128, 128] 0 ConvBlock-11 [-1, 128, 128, 128] 0 MaxPool2d-12 [-1, 128, 64, 64] 0 Conv2d-13 [-1, 256, 64, 64] 295,168 ReLU-14 [-1, 256, 64, 64] 0 Conv2d-15 [-1, 256, 64, 64] 590,080 ReLU-16 [-1, 256, 64, 64] 0 ConvBlock-17 [-1, 256, 64, 64] 0 MaxPool2d-18 [-1, 256, 32, 32] 0 Conv2d-19 [-1, 512, 32, 32] 1,180,160 ReLU-20 [-1, 512, 32, 32] 0 Conv2d-21 [-1, 512, 32, 32] 2,359,808 ReLU-22 [-1, 512, 32, 32] 0 ConvBlock-23 [-1, 512, 32, 32] 0 Upsample-24 [-1, 512, 64, 64] 0 Conv2d-25 [-1, 256, 64, 64] 1,769,728 ReLU-26 [-1, 256, 64, 64] 0 Conv2d-27 [-1, 256, 64, 64] 590,080 ReLU-28 [-1, 256, 64, 64] 0 ConvBlock-29 [-1, 256, 64, 64] 0 Upsample-30 [-1, 256, 128, 128] 0 Conv2d-31 [-1, 128, 128, 128] 442,496 ReLU-32 [-1, 128, 128, 128] 0 Conv2d-33 [-1, 128, 128, 128] 147,584 ReLU-34 [-1, 128, 128, 128] 0 ConvBlock-35 [-1, 128, 128, 128] 0 Upsample-36 [-1, 128, 256, 256] 0 Conv2d-37 [-1, 64, 256, 256] 110,656 ReLU-38 [-1, 64, 256, 256] 0 Conv2d-39 [-1, 64, 256, 256] 36,928 ReLU-40 [-1, 64, 256, 256] 0 ConvBlock-41 [-1, 64, 256, 256] 0 Conv2d-42 [-1, 1, 256, 256] 65 ================================================================ Total params: 7,781,761 Trainable params: 7,781,761 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.25 Forward/backward pass size (MB): 706.50 Params size (MB): 29.69 Estimated Total Size (MB): 736.44 ----------------------------------------------------------------random_input = torch.randn(1, 1, 256, 256).to(device) output = model(random_input) output.shapetorch.Size([1, 1, 256, 256]) 最后定义损失函数和优化器,编写模型的训练代码,在昇腾NPU上训练50轮,使用Adam优化器和BCEWithLogitsLoss损失函数,并通过ReduceLROnPlateau调度器动态调整模型的学习率,每轮训练结束后保存模型的最优权重。import time from torch.optim.lr_scheduler import ReduceLROnPlateau # 定义损失 loss_fn = torch.nn.BCEWithLogitsLoss() # 定义优化器 optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) # 动态减少LR scheduler = ReduceLROnPlateau(optimizer, 'min') # 计算测试集的loss def check_test_loss(loader,model): loss = 0 # 不记录梯度 with torch.no_grad(): for i, (x, y) in enumerate(loader): # 图片 x = x.to(device,dtype=torch.float32) # 标签 y = y.to(device,dtype=torch.float32) # 预测值 y_pred = model(x) #计算损失 loss_batch = loss_fn(y_pred, y) loss += loss_batch return loss / len(loader) !pip install tensorboard progressbar# 使用tensorboard记录参数 from torch.utils.tensorboard import SummaryWriter # 使用progressbar打印进度 from progressbar import ProgressBar, Percentage, Bar, Timer, ETA, FileTransferSpeed # 记录变量 writer = SummaryWriter(log_dir='./log') # 打印进度 widgets = ['Progress: ', Percentage(), ' ', Bar('#'), ' ', Timer(), ' ', ETA(), ' ', FileTransferSpeed()] # 训练100个epoch EPOCH_NUM = 50 # 记录最好的测试acc best_test_loss = 10 # 保存训练结果 train_loss_results = [] test_loss_results = [] for epoch in range(EPOCH_NUM): # 获取批次图像 print('Epoch:{}'.format(epoch+1)) start_time = time.time() loss = 0 progress = ProgressBar(widgets=widgets) for (x, y) in progress(train_loader): # !!!每次update前清空梯度 model.zero_grad() # 获取数据 # 图片 x = x.to(device,dtype=torch.float32) # 标签 y = y.to(device,dtype=torch.float32) # 预测值 y_pred = model(x) #计算损失 loss_batch = loss_fn(y_pred, y) # 计算梯度 loss_batch.backward() optimizer.step() optimizer.zero_grad() # 记录每个batch的train loss loss_batch = loss_batch.detach().cpu() loss += loss_batch # 每个epoch的loss loss = loss / len(train_loader) # 如果降低LR:如果loss连续10个epoch不再下降,就减少LR scheduler.step(loss) # 计算测试集的loss test_loss = check_test_loss(test_loader, model) # tensorboard 记录 Loss/train writer.add_scalar('Loss/train', loss, epoch) # tensorboard 记录 Loss/test writer.add_scalar('Loss/test', test_loss, epoch) #保存信息 train_loss_results.append(loss.item()) test_loss_results.append(test_loss.item()) # 保存最新模型 torch.save(model.state_dict(), 'unet_latest.pt') # 记录最好的测试loss,并保存模型 if best_test_loss > test_loss: print('test loss improved from {:.4f} to {:.4f}'.format(best_test_loss, test_loss.item())) best_test_loss = test_loss # 保存模型 torch.save(model.state_dict(), 'unet_best.pt') Epoch:1 Progress: 0% | | Elapsed Time: 0:00:00 ETA: --:--:-- 0.00 B/s . Progress: 100% |##############| Elapsed Time: 0:00:29 Time: 0:00:29 7.17 B/s test loss improved from 50.0000 to 0.1825 Epoch:2 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.90 B/s test loss improved from 0.1825 to 0.1356 Epoch:3 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.88 B/s test loss improved from 0.1356 to 0.1190 Epoch:4 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.88 B/s test loss improved from 0.1190 to 0.1071 Epoch:5 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s test loss improved from 0.1071 to 0.0826 Epoch:6 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.98 B/s test loss improved from 0.0826 to 0.0783 Epoch:7 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s Epoch:8 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.01 B/s test loss improved from 0.0783 to 0.0564 Epoch:9 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.01 B/s Epoch:10 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.02 B/s Epoch:11 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.96 B/s Epoch:12 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s Epoch:13 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s test loss improved from 0.0564 to 0.0546 Epoch:14 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s Epoch:15 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.89 B/s Epoch:16 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s Epoch:17 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.01 B/s Epoch:18 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.01 B/s test loss improved from 0.0546 to 0.0502 Epoch:19 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.02 B/s Epoch:20 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s Epoch:21 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.98 B/s Epoch:22 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s test loss improved from 0.0502 to 0.0434 Epoch:23 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s Epoch:24 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.98 B/s Epoch:25 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s Epoch:26 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.94 B/s Epoch:27 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.84 B/s Epoch:28 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.93 B/s Epoch:29 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.89 B/s Epoch:30 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.96 B/s Epoch:31 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.94 B/s Epoch:32 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.92 B/s Epoch:33 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.88 B/s Epoch:34 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.93 B/s Epoch:35 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.97 B/s Epoch:36 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.92 B/s Epoch:37 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.91 B/s Epoch:38 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.93 B/s Epoch:39 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.91 B/s Epoch:40 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.89 B/s Epoch:41 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.87 B/s Epoch:42 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.96 B/s Epoch:43 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.97 B/s Epoch:44 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.97 B/s test loss improved from 0.0434 to 0.0378 Epoch:45 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.96 B/s Epoch:46 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.91 B/s Epoch:47 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s Epoch:48 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.99 B/s Epoch:49 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 7.98 B/s Epoch:50 Progress: 100% |##############| Elapsed Time: 0:00:26 Time: 0:00:26 8.00 B/s 在模型的训练过程中,我们可以在另一个终端中查看NPU的利用率:训练结束后我们使用matplotlib绘制模型的损失曲线,观察在训练过程中loss的收敛情况。plt.plot(range(1, len(train_loss_results)+1), train_loss_results, label='train_loss') plt.plot(range(1, len(test_loss_results)+1), test_loss_results, label='test_loss') plt.title('Model Loss') plt.legend() 这里我们加载模型在训练过程中的最优权重在测试集上评估模型的训练效果:model.load_state_dict(torch.load('unet_best.pt')) model.eval() UNet( (layer1): ConvBlock( (step): Sequential( (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer2): ConvBlock( (step): Sequential( (0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer3): ConvBlock( (step): Sequential( (0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer4): ConvBlock( (step): Sequential( (0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer5): ConvBlock( (step): Sequential( (0): Conv2d(768, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer6): ConvBlock( (step): Sequential( (0): Conv2d(384, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer7): ConvBlock( (step): Sequential( (0): Conv2d(192, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) ) (layer8): Conv2d(64, 1, kernel_size=(1, 1), stride=(1, 1)) (maxpool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (upsample): Upsample(scale_factor=2.0, mode='bilinear') (sigmoid): Sigmoid() ) class SegmentDataset(Dataset): def __init__(self,where='train',seq=None): # 获取数据 self.img_list =natsorted(glob.glob('processed/{}/*/img_*'.format(where))) self.mask_list =natsorted( glob.glob('processed/{}/*/img_*') ) # 数据增强pipeline self.seq = seq def __len__(self): # 返回数据大小 return len(self.img_list) def __getitem__(self, idx): # 获取具体每一个数据 # 获取图片 img_file = self.img_list[idx] mask_file = img_file.replace('img','label') img = np.load(img_file) # 获取mask mask = np.load(mask_file) # 如果需要数据增强 if self.seq: segmap = SegmentationMapsOnImage(mask, shape=mask.shape) img,mask = seq(image=img, segmentation_maps=segmap) # 直接获取数组内容 mask = mask.get_arr() # 灰度图扩张维度成张量 return np.expand_dims(img,0) , np.expand_dims(mask,0) !pip install natsortfrom natsort import natsorted # 使用dataloader加载 batch_size = 12 num_workers = 8 test_dataset = SegmentDataset('test',None) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, num_workers=num_workers, shuffle=False) !pip install celluloidfrom tqdm import tqdm from celluloid import Camera from IPython.display import Image # 将每层画面制作成视频 fig = plt.figure(figsize=(10, 10)) camera = Camera(fig) # 遍历所有数据 index = 0 for x, y in tqdm(test_dataset): # 输出输入 input = torch.tensor([x]).to(device,dtype=torch.float32) # 推理 y_pred = model(input) # 获取mask mask_data = (y_pred.detach().cpu().numpy()[0][0] > 0.5) plt.subplot(1, 2, 1) plt.imshow(x[0], cmap='bone') mask_ = np.ma.masked_where(y[0] == 0, y[0]) plt.imshow(mask_, alpha=0.8, cmap="spring") plt.title('truth') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(x[0], cmap='bone') mask_ = np.ma.masked_where(mask_data == 0, mask_data) plt.imshow(mask_, alpha=0.8, cmap="spring") plt.title('prediction') plt.axis('off') camera.snap() index +=1 if index > 500: break animation = camera.animate() 0%| | 0/177 [00:00<?, ?it/s]/home/service/.local/lib/python3.10/site-packages/torch_npu/contrib/transfer_to_npu.py:151: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /pytorch/torch/csrc/utils/tensor_new.cpp:261.) return fn(*args, **kwargs) 100%|██████████| 177/177 [00:06<00:00, 29.07it/s] # convert the animation to a video animation.save('animation.gif', writer='imagemagick') Image(open('animation.gif','rb').read()) 可以看到,模型准确地分割出肺炎的病变区域,为医疗诊断提供决策支持。本案例充分体现了华为云昇腾AI平台在医学图像处理领域的强大计算能力和易用性,为医疗AI应用的开发提供了完整的实践范例。
-
案例介绍本案例开发一个sql生成助手,对于一些不经常写sql的开发,写sql时手忙脚乱,本案例旨在基于人工智能大模型DeepSeek根据需求帮助生成对应sql。 案例内容一、概述1. 案例介绍通过实际操作,利用Astro低代码平台开发一个最简单应用。在这个过程中,学习从模型集成、界面操作一系列关键步骤,从而掌握Astro低代码平台的基本使用方法及于大模型的结合,体验其在应用开发中的优势。开发者空间Astro低代码开发平台通过平台提供的界面、逻辑、对象等可视化编排工具,以“拖、拉、拽”的方式来快速构建应用,从而实现所见即所得的应用开发构建体验。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。ModelArts Studio(MaaS)平台:是华为云推出的一款大模型即服务平台,可以一站式的对业界主流开源大模型进行部署托管,同时开放大模型API服务,可以结合业界主流Agent开发框架,轻松构建AI Agent应用。2. 适用对象企业个人开发者高校学生3. 案例时间本案例总时长预计30分钟。4. 案例流程说明:领取华为开发者空间,登录华为开发者空间-低代码应用开发平台;新建低代码应用,进入Astro轻应用服务控制台主页,开发应用;5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)MaaS 平台商用模型DeepSeek-R1 轻量体验包(¥7.00)/ DeepSeek-V3 轻量体验包(¥3.50)领券免费30华为开发者空间 - 低代码应用开发平台系统标配免费30二、开通MaaS 平台商用模型商用百万Token活动连接:每周畅领100万商用级Tokens!基于CloudMatrix384超节点,Token时延低、TPM/RPM速率高,助您开发商用级AI应用!商用百万Token代金券免费领取链接(可每周领取):DeepSeek-R1/V3-64K百万tokens代金券:cid:link_21、大模型领取:切换到开发者空间首页,或者点击上面连接,参与活动“百万商用服务tokens免费领!”活动,按照使用说明进行服务开通:活动页面:2、开通完成后,进行大模型的接入:ModelArts控制台:ModelArts - Console模型部署页:部署页面,点击调用按钮,进入调用页面,这里我们提前保存好Api地址和模型名称,点击API调用说明:3、创建apikey点击前往API Key管理创建apikey点击新建创建apikey注意!!创建好API Key之后,点击后面的复制按钮,妥善保存,若未复制保存,后续无法重新复制获取。 三、华为开发者空间-低代码应用开发平台1. 登录华为开发者空间-低代码应用开发平台华为开发者空间-低代码应用开发平台是华为云推出的一款可视化应用开发平台,旨在通过"拖拽式"组件和模板化设计,降低开发门槛,提升企业数字化应用构建效率。平台主要特点包括:可视化开发:通过图形化界面和预置组件,无需编写复杂代码即可快速搭建应用;全场景支持:覆盖Web、移动端、大屏等多终端应用开发;高效集成:内置连接器可快速对接华为云及其他主流企业系统;智能辅助:提供AI辅助开发能力,如智能表单生成、流程自动化等;企业级能力:具备权限管理、数据安全、高可用等企业所需特性。Astro平台特别适合业务人员与开发者协同创新,能大幅缩短应用交付周期,典型适用于OA审批、数据看板、轻量级业务系统等场景。登录华为开发者空间,在左侧菜单列表选择华为开发者空间 -> 开发平台 -> Astro 低代码开发,进入华为开发者空间-低代码应用开发平台。2. 创建低代码应用1、华为开发者空间-低代码应用开发平台页面点击新建低代码应用,在弹出的新建低代码应用对话框中,选择标准应用,点击确定按钮。 注:命名空间为租户数据唯一标识,为免重复,首次创建或使用工程时需定义命名空间。请务必慎重,一旦定义,不可修改,推荐使用公司前缀。本案例中使用Astro_banjin作为命名空间。 2、在右侧弹出的新建空白应用配置页签中,配置应用名称和标签均为Job。3、点击右下角确认按钮,平台会自动打开一个新的页面:Astro轻应用服务控制台。注:在点击确认后,在Astro轻应用管理页会同时新增一条刚才创建的名称为Astro_Test__sql的应用,点击编辑同样可以进入Astro轻应用服务控制台。4、创建大模型连接器点击左侧集成 - 连接器实例 - 大模型 - MaaS云平台:点击右上角加号,创建自定义连接器,输入标“标签”(这里为sql,可自定义)、“名称”(这里填入MaaS,可自定义)、“模型名称”(前步保存的模型名称)和“APIKey”(前步保存的apiKey);点击保存:注意:这里一定要开通maas的商用服务,免费服务不可以添加结果:测试连通性,点击“测试”,在弹出框中输入测试内容后,点击测试等待返回结果,正常返回说明添加成功:5、添加页面 在新版应用设计器的“界面”中,单击页面后的添加图标,设置页面标签为“sql”、名称为“sql”,单击“添加”,即可创建一个标准页面:添加表单:从左侧“组件”区域,将智能化智能助手”组件拖拽到页面中间选中智能助手组件,在“属性 > 品牌名”中,输入“sql生成助手” 选中智能助手组件,在“属性 > 高级属性”中,打开“大模型”开关。在“默认大模型”中,单击“设置默认模型”,选择上面步骤中创建的大模型连接器单击页面上方的保存按钮,保存标准页面6、预览功能在已保存的标准页面中,单击左上角预览图标,进入预览页面。在智能助手的聊天框中,输入文字,例如“帮忙出一个update脚本,根据rq为2022年3月28到2022年5月1日,A表里的mc不为空而b表里的mc为空,A表的hm =b表的hm,A表的xh = b表的xxxh这几个条件做一个关联查询,然后将a里的mc赋值到b表里的mc”,单击“发送” 我正在参加【案例共创】第7期 基于MaaS商用服务 + 华为开发者空间 - Astro 低代码开发平台构建低代码应用 cid:link_4
-
华为开发者空间携手HCSD校园大使助力全国高校“百团大战”!不仅为高校开发者基于“华为开发者空间”提供云开发环境、AI Notebook等平台工具,更有千元开发者定制好礼,快叫上小伙伴一起来参加吧~ 【活动流程】① 点击报名 → ② 提交活动策划方案 → ③ 活动执行 → ④ 活动验收备注:活动方案:格式不限,需包含社团情况介绍,活动策划方案(含开发者空间推广方案)等。活动验收:提交活动总结报告,并在HCSD社区论坛发布活动组织心得或简报。 【参与条件】1.参与形式:HCSD校园大使在社团活动、学生会、各协会及班级/年级群等组织,策划落地。2.参与资格:已加入华为云学生开发者计划(HCSD)的校园大使,非HCSD校园大使可立即至官网申请加入。3.支持名额有限,以完成活动验收的次序进行支持。 【活动激励】1.众多奖品可供选择,华为音箱、体脂称、手环,更有开发者双肩包、冲锋衣、云宝盲盒等好礼,线下推广易拉宝,宣传单页等物料。可用于社团招新、活动推广、社员福利等场景。(其中线下物料可预支申领)2.活动覆盖人数达百人的,可支持累计价值千元的奖品;单次活动累计奖品价值最高为三千元;具体奖品支持数量视活动覆盖人数及社团规模而定。3.校园大使晋级激励:参与完成活动,可在年度优秀校园大使评选中作为加分项。具体活动细则见HCSD校园大使官方社群 部分奖品实物图如下~
-
本次产品体验官活动获奖名单如下:一、有效建议奖:昵称建议分值奖项礼品yd_28463775010有效建议奖第一名1000元开发者定制礼品给无眠点压力9有效建议奖第二名800元开发者定制礼品小草飞上天3.5有效建议奖第三名500元开发者定制礼品二、优质建议奖:无恭喜以上3名获奖用户,请获奖用户通过以下问卷反馈奖品收件信息(10月30日前反馈有效),感谢大家对云声平台的关注和支持~ 华为开发者空间已经上线一年多啦!在这一年多的时间里,我们不断成长,不断丰富产品能力,目前已经拥有上百万用户;我们有多形态的云上开发环境,开发者可通过各类终端远程访问云端资源,还能无缝对接 VS Code、PyCharm 等主流 IDE,支持多种开发工具链与框架;我们有AI智能体开发平台,支持低代码/零代码对话式Agent开发,提供常用模板,快速构建各类职能Agent;我们还有低代码Astro平台、云函数FunctionGraph、AI Notebook等一系列平台与工具;同时提供各种免费资源,如GaussDB领取、tokens领取等等;面对开发者空间的成长与变化,作为开发者的您是怎么看的呢?您又希望开发者空间提供哪些能力?大家可以针对开发者空间的使用感受,问题bug,优化建议,未来方向,提出宝贵意见;提交建议还可以领取开发者礼包,包括但不限于华为耳机、手环等好礼;快叫上小伙伴一起提建议吧~ 【实践项目】登录华为开发者空间,实践任意项目皆可。建议种类不限,可以是:产品bug、使用体验、对产品未来功能与形态的建议等等。 【活动时间】2025年9月9日-10月8日 【参与方式】01 体验开发者空间 》 02 去云声平台提建议 》 03 建议评估公示 》 04 获奖公示(活动结束后两周内) ps:建议标题需要以“开发者空间体验官”开头 【奖项设置】奖项设置评选条件获奖名额激励礼品有效建议奖1、有效建议数量不少于2条,有效建议由内部技术专家评审得出2、建议内容需针对上述实践项目3、有效建议中有不低于一条是关于功能建议的3名积分榜第1名:1000元礼品/人积分榜第2名:800元礼品/人积分榜第3名:500元礼品/人优质建议奖1、优质有效建议不少于1条,由内部技术专家评审选出10名每人100-200元开发者定制礼品【活动说明】1、建议预审通过即为有效建议,其中1条有效功能类建议为1分,1条有效体验类建议为0.5分,1条有效Bug类建议0.5分;有效建议奖与优质建议奖不可叠加2、建议提交时需要在标题中以“【开发者空间体验官】”为建议标题开头,比如【开发者空间体验官】开发者空间增加XX/优化XX/导入XX等3、建议内容仅针对以上实践项目中“开发平台功能体验+开发平台案例体验”涉及的云产品,非以上实践项目涉及产品建议内容不参与此活动4、优质建议要求建议对云产品功能及优化改进有重要作用,优先从已被采纳的建议的选择;建议内容需要表述清晰,有明确的建议方案,最好有操作截图或链接等能进一步详细描述;高价值建议数量不限,且与有效建议奖可叠加,每位用户每月最多可获得一次。5、注意事项1)若出现积分相同且排名一致的情况,结合已实现和已采纳建议情况,由内部技术专家选出价值更高的建议用户给予奖励2)同一用户在同一页面(文档)提出的同一类用户体验问题(包括但不限于错别字、语句不通顺、视觉体验等),在通过审核后仅算作一条有效建议数3)若发现代他人提交优化建议,此建议分值只取原分值30%;若发现2次及以上重复提交他人建议,或3次及以上重复提交体验类相关建议进行恶意刷量(包括但不限于错别字、语句不通顺、视觉体验等),取消本人活动参与资格;在活动截止日前进行大量刷屏提交建议,或者重复提交同类型体验建议,直接取消活动参与资格4)以上兑换礼品均为仓库现有实物礼品,有货的情况下优先满足,其中1-3名可优先选择华为自营品牌电子礼品,礼品价值不能超过商品原价,无货则不可以指定,如遇商品缺货,将随机换成其他等价值礼品发放5)此【开发者空间体验官】与云声月度例行激励活动不叠加,若标题无【开发者空间体验官】标记,则有效建议默认参与月度例行激励
-
体验华为开发者空间《华为开发者空间-云主机镜像制作与复制分享功能指导》案例,反馈改进建议,请直接在评论区反馈即可。体验指导:https://devstation.connect.huaweicloud.com/space/devportal/casecenter/0c91f1053ae748dd9b668c8ec52c1115/1
-
一、 领取——免费领百万Tokens1.1 领取代金券和购买套餐包华为开发者空间为开发者带来百万Token代金券福利,点击下方连接按照指引进行代金券的领取和套餐包的购买。cid:link_2 领取成功后可在费用中心优惠券中查看 1.2 开通商用模型服务代金券领取完毕后前往ModelArts Studio进行商用模型开通。进入MaaS控制台页面,点击在线推理 -> 商用服务 -> 开通模型服务,这里以DeepSeek-R1-64K,然后点击一键开通。注意:步骤1.1中若是购买的DeepSeek-R1-64K套餐包,在MaaS中开通时请开通DeepSeek-R1-64K,同理若购买DeepSeek-V3-64K时,请开通DeepSeek-V3-64K。 1.3 获取模型调用参数这里拿DeepSeek-R1-64K模型为例,开通完毕后点击调用说明,版本选择DeepSeek-R1主推版,进入页面后可以看到API地址和model参数。 点击API Key管理,进入页面后,点击右上角创建API Key,标签和描述可以自定义,输入完毕后点击创建。(注意:创建好的API Key只会显示这一次,请妥善保存) 二、 使用——主流AI框架接入模型参考2.1 在Versatile Agent中配置模型进入到华为开发者空间开发平台Versatile Agent后,点击大模型 -> 我创建的 -> 新增模型供应商,随后进行模型供应商参数配置,参数配置如下:参数名称配置方法供应商图标可以定义上传,要求大于1K小于100k供应商名称可自定义供应商英文名称可自定义简介根据用户实际情况填写(不是必要参数,可不填)鉴权方式API key(输入步骤1.3中获取的API Key)参数填写完毕后点击确定。 供应商名称添加完毕后,点击下拉键,再点击新增模型服务。 模型服务的具体参数配置如下,参数填写完毕后点击确定即可。参数名称配置方法服务名称开发者可以自定义输入名称模型名称步骤1.3中获取的model参数模型类型文本对话模型服务API地址步骤1.3中获取的API地址API接口协议标准OpenAI协议流控配置无限制是否支持工具调用是是否支持思维链是模型服务描述非必要参数,可根据实际情况填写 添加完毕后返回模型供应商列表,点击发布模型。 发布成功后,至此Versatile Agent中自定义接入大模型已完成。返回Agent列表,点击创建Agent。 这里创建一个简单的Agent作为演示,Agent名称和描述输入Test_demo,模型选择步骤二中新增的模型服务。 模型选择完毕后,进行提问,你好。 可以看到,Agent可以正常使用了,至此,Versatile Agent中自定义接入大模型配置华为云MaaS指导已全部完成。 2.2 在Cline中配置模型在VSCode编辑器中安装好Cline插件后,点击左侧菜单栏Cline图标,点击对话框右上角设置按钮,配置领券后开通的对应模型信息即可。以下是开通的商用DeepSeek-R1-64K服务为例的配置参考: 2.3 在Cherry Studio中配置模型在Cherry Studio中配置模型服务时选择OpenRouter,然后配置“1.3 获取模型调用参数”章节获取的API Key和模型地址和名称,以下是开通的商用DeepSeek-R1-64K服务为例的配置参考:使用Cherry Studio +MaaS实操实践可以参考: 《开发者空间部署Cherry Studio+高德地图MCP Server构建出行规划助手》 更多平台接入MaaS模型示例更新中...
-
产品已提供在线申请,有镜像分享需求开发者,请在“我的镜像”页面右上角,点击申请分享权限,白名单内测关闭。 华为开发者空间云主机镜像分享能力开始内测啦,从此后我们可以自己制作云主机镜像,并分享给他人使用了!即日起,只需要提交问卷,提供华为云账号的domainid( 账号ID)和iamid(IAM用户ID),审核通过后就可以抢先体验空间云主机镜像分享能力,赶快报名吧! domainid与iamid获取路径:华为云账号中心——我的凭证(鼠标悬浮右上角账号)——即可找到“IAM用户ID”与“账号ID” 点击此处报名:报名链接 点击此处查看使用指导:使用指导
-
前言概述本文档详细描述了(测试环境数据为例)开发环境的操作指导,可指导运营人员创建开发环境-cli端建立隧道-三方工具连接使用等。主流程介绍流程图状态流转中操作示意:状态/操作开机关机延时删除开机中xx√x运行中x√√x关机中xx√x已就绪√x√√权限权限审视模块账号涉及菜单用户面华为云主账号开发环境使用地址使用地址开发环境:cid:link_1开发者空间-开发平台-计算-开发环境:(华为云账号登录)web端创建5.1.1前置条件用户未创建开发环境备注:web端及pc端均可创建,当前展示web端,pc端见下章节5.1.2操作步骤①点击新建开发环境弹出开发环境新建窗口,如下展示:②基本信息填写(示例):环境名称:XXXXCPU架构:XXXX规格:XXXX操作系统:XXXX代理端口(可选):例:8080,8085,8086,8087,8089默认账号:XXXX(开发者自行定义)密码:XXXX(开发者自行定义)参数表:参数参数说明环境名称必填,可包含数字、字母、下划线,长度不超过15个字符,不能以数字开头。CPU架构默认配置,不可更改。规格默认配置,不可更改。操作系统默认配置,不可更改。代理端口(可选)非必填,可代理的端口范围 8080-8089, 最多可以配置5个端口,端口号之间以英文逗号隔开,默认端口为22。默认账号必填,4~16个英文小写字母,不可使用系统保留的用户名root、agent。密码必填,8~32个字符至少包含以下字符中的3种:大写字母、小写字母、数字和特殊字符,特殊字符仅支持~!@#$%^*-_=+?③填写完成后-点击提交,开发环境创建成功!页面新增一条数据,开发环境名称为Devenvironment,状态:已就绪,操作按钮:远程连接、开机、关机、延时、删除注:当前版本只支持用户创建一个开发环境开机5.2.1前置条件开发环境已创建,状态:已就绪5.2.2 操作步骤①点击【开机】页面数据更新,状态由已就绪-开机中-运行中,如下:备注:开机需耗时1~3分钟关机前置条件开发环境已在运行中5.3.2操作步骤①点击【关机】页面数据更新,状态由运行中-关机中-已就绪,如下:备注:关机需1~3分钟延时5.4.1前置条件创建开发环境后,使用时长为15小时,当用户时长小于60分钟时可成功申请延时5.4.2操作步骤①点击【延时】②点击确定,延时成功删除5.5.1前置条件开发环境状态为已就绪5.5.2 操作步骤①点击【删除】页面数据更新,状态由已就绪-删除中-数据清空,如下:远程连接5.6.1背景cli工具下载,用户使用CLI端远程登录到开发环境进行使用5.6.2操作步骤①点击【立即下载】② 下载后,本地到exe所在的目录下进行cli命令操作:CLI端所有命令help命令动作命令开发者空间帮助hdspace --help开发环境顶层帮助hdspace devenv --help开发者空间配置帮助hdspace config --help开发者空间版本帮助hdspace version --help开发环境列表帮助hdspace devenv list --help创建开发环境帮助hdspace devenv create --help启动开发环境帮助hdspace devenv start -- help关闭开发环境帮助hdspace devenv close --help删除开发环境帮助hdspace devenv delete --help建立隧道帮助hdspace devenv start-tunnel --help操作命令动作命令用户配置更新AK/SKhdspace configCLI版本hdspace version查看开发环境列表hdspace devenv list创建开发环境hdspace devenv create --name=name [--account=account --ports=ports]启动开发环境hdspace devenv start --instance-id=Instance-Id关闭开发环境hdspace devenv close --instance-id=Instance-Id删除开发环境hdspace devenv delete --instance-id=Instance-Id建立隧道hdspace devenv start-tunnel --instance-id=instanceId [--remote-port=remotePort --local-port=localPort]如何获取AKSK获取AKSK地址如下:cid:link_0进入控制台进入‘我的凭证’访问秘钥CLI内操作步骤6.2.1 配置更新AK/SK①背景用户配置ak/sk,等同于在cli中进行身份信息认证,从而可以在cli端对开发环境进行操作②操作用户首次使用cli,在输入cli开发环境操作命令前,需要配置ak/sk:1)可以使用配置命令主动设置aksk配置AKSK:hdspace config2)或者直接输入其他cli开发环境操作命令(如hdspace devenv list等),程序会判断用户是否已保存过aksk,若未保存提示用户去控制台获取并配置6.2.2 创建开发环境①前置条件已配置AK,SK②操作创建开发环境:hdspace devenv create --name=name [--account=account --ports=ports]参数:-- name必填:开发环境名称,可包含数字、字母、下划线,长度不超过15个字符,不能以数字开头;-- account选填:默认账号,4~16个英文小写字母,不可使用系统保留的用户名root、agent,不填默认为developer;-- ports选填:代理端口,可代理的端口范围 [8080-8089], 最多可以配置5个端口,端口号之间以英文逗号隔开,默认端口为22。6.2.3 启动开发环境①前置条件用户已创建开发环境,且开发环境状态为已就绪②操作启动开发环境 命令:hdspace devenv start --instance-id=Instance-Id备注:开机大概1~2分钟,需耐心等待6.2.4 查看开发环境查看开发环境:hdspace devenv list6.2.5建立隧道①前置条件开发环境状态为运行中②操作建立隧道:hdspace devenv start-tunnel --instance-id=instanceId[--remote-port=remotePort --local-port=localPort]参数:--instance-id 必填:开发环境实例ID--remote-port选填:开发环境端口号 (8080-8089),不指定时,默认22--local-port选填:本地监听端口号 (0-65535),不指定时,则与开发环境端口号一致备注:隧道建立之后,可连接第三方工具使用,详见第7章6.2.6 关闭开发环境①前置条件开发环境状态为运行中②操作关闭开发环境:hdspace devenv close --instance-id=Instance-Id备注:关闭大概1~2分钟,需耐心等待6.2.7 删除开发环境①前置条件开发环境已关机,状态:已就绪②操作删除开发环境:hdspace devenv delete -instance-id=instanceId备注:删除大概3~5分钟,需耐心等待与三方工具连接命令行连接(xshell、putty等)cli建立隧道(cmd/powershell),监听到开发环境、本地,双方端口用三方软件进行连接连接成功,cli开启数据双向转发登录到开发环境进行操作示例1:使用预置的工具集开发工具已安装:OpenJDK、Python、NodeJS、Git、SDK1)命令查看相应的工具集OpenJDK,执行命令java -versionPython,执行命令python -VNodeJS,执行命令node -v和npm -vGit,执行命令git --version仓颉SDK,执行命令cjc -v2)用户自主使用工具集进行开发示例2:上传下载文件使用xftp,进行文件的上传下载示例3:在开发环境内起服务,监听用户自定义端口(如8085),用该端口建立隧道进行自开发1)cli建立隧道a,其中remote-port为22端口,local-port自定义2)三方软件登录到开发环境,监听到用户自定义的8085端口:例:python3 -m http.server 8085(在Python 3中启动一个简单的HTTP服务器,监听端口8085)3)cli建立隧道b,其中remote-port为8085端口,local-port自定义(不能和隧道a的本地端口冲突)4)web登录到开发环境起的服务http://localhost:b(b为本地端口),进行操作关闭隧道Crtl+C停止隧道 或者 关闭cmd/powershell窗口,隧道断开连接,双向转发停止三方应用可视化插件连接(vscode、codearts ide等)cli建立隧道(cmd/powershell),监听到开发环境、本地,双方端口(如7.1步骤1)在三方软件下载远程连接插件,进行连接示例1:VSCode示例2:CodeArts连接成功,cli开启双向转发——》登录到开发环境进行操作——》关闭隧道(如7.1步骤3-5)
-
Ø 开通AI Agent服务时,系统总是提示开通失败。华为账号未实名认证、华为账号欠费或者在其他渠道开通过AIAE,都可能导致开通失败,请先排查以上原因,若均为正常,请在开发者空间中提交工单。Ø 在开发者空间里面不允许以公测的身份来访问AIAE么?是的,AIAE有2个限定规则:1. 公测环境和开发者空间环境是独立的,二者的订阅结果不能互通。2. 单账号下只能有一个环境,不能同时开通公测环境和开发者空间环境,必须退订前者才能订阅后者。Ø 为何我的开发环境只能使用22端口,其他端口配置了连接不上?开发环境,默认就有ssh服务在监听22端口,所以,可以通过隧道反代22号端口,从而访问开发环境的ssh服务。而其它端口,在创建开发环境的时候指定,也只是说安全组放开了这个端口,此时,如果想反代该端口,那就要在开发环境上,有服务去监听该端口。Ø 云主机是和云开发环境,时间是共享的吗?是的,云主机和开发环境共享180小时Ø 云开发环境,一直是Ready状态,之前报时间不够,但延时后还是报这个问题。是需要把开发环境删除了,重新操作吗?不需要,云开发环境点击延时,才能继续用,不用重新建开发环境Ø 大模型Agent免费额度有限制吗?有,100W,与MAAS额度共享Ø (Linux)为什么运行hdspace会提示创建密钥环?hdspace依赖于系统的默认密钥环来存储您配置的AKSK(访问密钥和秘密密钥)。如果系统中不存在默认密钥环,hdspace会自动创建一个名为“login”的密钥环来保存这些敏感信息。您可以将创建的“login”密钥环设置为默认密钥环。这样可以简化后续操作,避免重复输入密码。注意: 请妥善保管此密码,因为后续使用时需要该密码来解锁密钥环。Ø (Linux)为什么运行hdspace会提示,The current environment does not support key persistence?hdspace依赖于图形化密钥管理的gnome-keyring组件来进行密钥的持久化存储。如果您的系统中没有安装此组件,或者该组件运行不正常,hdspace将无法使用gnome-keyring进行密钥管理,转而采用Linux内核密钥管理。注意:在这种情况下,配置的AKSK会在系统重启后消失,需要您重新配置。Ø (macOS)为什么运行hdspace会提示“无法打开hdspace,因为Apple无法检查其是否包含恶意软件”?A、在终端中输入以后允许安装任何来源的应用的命令“sudo spctl --master-disable”B、终端中输入密码无任何反应属于正常现象,输完密码直接按回车键“Enter” 点击链接,立即开通开发者空间
-
有哪些开发工具可以选择?当前云主机集成了CodeArts IDE工具,开发者空间提供便捷开发桌面,开发工具由开发者自行选择安装。是否可以安装其他软件?是,开发者空间提供便捷开发桌面,开发工具由开发者自行选择安装。如何在云主机中部署 ENSP_PRO数通模拟器?当前暂时不支持在在云主机中部署 ENSP_PRO数通模拟器,敬请期待。如何在云主机中安装CodeArts IDE?当前云主机集成了CodeArts IDE工具,支持Java、python和仓颉工具集,您可以在配置云主机是进行选择。云主机配置选错了可以修改吗?若需要更改开发语言,请在云主机关机(已就绪)状态下,点击云主机卡片上的重置按钮,然后重新配置云主机即可。想把arm机器重置为X86,该怎么办?若需要更改开发语言,请在云主机关机(已就绪)状态下,点击云主机卡片上的重置按钮,然后重新配置云主机即可。云主机中右键压缩功能找不到怎么办?可以在终端使用sudo apt install zip命令安装压缩工具。开发空间云主机安装宝塔面板后连接不上了怎么办?当前云主机不支持接入宝塔面板工具,如果强行安装造成无法连接,您可以请在开发者空间中提交工单申请重置云主机并附上您云主机页面的网址,我们将对您的云主机进行重置(重置云主机将导致您的数据丢失,请慎重申请)。启用了ufw防火墙后云主机无法远程连接在使用过程中建议不要启用防火墙,设置防火墙后,云主机的远程通信接口会被毙掉,会导致无法远程连接成功,如已启用造成无法连接,请在云主机关机(已就绪)状态下,点击云主机卡片上的重置按钮,然后重新配置云主机即可。选择JS工具集,为什么装的是python IDE?Python和js的ide是一个。云主机中CodeArts IDE的调试控制台与tqdm包不匹配,不能正确刷新进度条CodeArts IDE对tqdm包兼容性问题,短期内不会支持,建议内置终端或者外置终端中输出。CodeArts Python版支持导出复杂文件夹么?云主机中复杂文件夹可以通过压缩包的方式上传至云存储空间,在本地登录云存储空间并下载,详情见本地与云主机间的文件交互指南。CodeArts IDE 同时打开多个项目, 内存不够会出现卡顿现象,如何处理? CodeArts IDE 同时打开多个项目, 内存不够会出现卡顿现象,请安如下步骤处理:卡顿后,如果出现无法操作云主机,等待出现未响应提示,选择关闭。但此时CodeArts 会有残留进程遗留。 之后再打开CodeArts 大概率会导致机器卡住,CodeArts 卡死。这是因为关闭了所有IDE后但是codeArts 得进程没有正常退出。解决办法:可以通过以下命令杀死残留进程。 ps -ef | grep 'codearts' | awk '{print $2}' | xargs kill -9不推荐同时打开太多得CodeArts 窗口,如果要打开多个python项目,请等待python 项目初始化完成再打开新的项目窗口。开发者空间能力的提升离不开您的使用与建议,欢迎各位开发者持续使用开发者空间,使用过程中,遇到问题、产品建议可以通过工单、云声建议、ISSUE支持等服务,反馈给我们,我们将及时审核并向您反馈审核结果。点击链接,立即开通开发者空间
-
华为开发者空间是做什么的?开发者空间是基于构建华为统一开发者生态战略目标下推出的统一开发者入口平台,作为2D开发者触点,推广华为的根生态能力,免费提供相关便捷工具和资源,助力开发者快速体验使用华为根技术。空间提供各种华为根生态工具、预置各种根生态场景化资源,配套提供各种技术快速学习体验试用的手把手指导体验案例文档。提示我的使用时长即将耗尽了怎么办?当您的使用剩余时长小于1小时,点击延时按钮可增加15小时的使用时长,每个账号的云主机使用时长为180小时/年,如果超过这个上限您可以提交工单申请延时。如何给我的云主机重置系统?步骤:云主机关机(已就绪)状态下,点击云主机卡片上的重置按钮,然后重新配置云主机。我的工作空间页面主机配置信息与主机内不一致?X86版本云主机目前是2核4G;ARM版本云主机目前是4核8G。云主机可以使用SSH远程链接吗?当前暂不支持ssh远程链接功能,敬请期待。是否可以清除数据重新申领云主机?华为云能力,当前每个账号只可申领一台免费的云主机进行体验。暂不支持,您可以通过重置功能清除数据,重新配置云主机。或者升级专业会员,同时拥有基础主机和专业主机。在云主机搭建一个web应用,外网怎么访问云主机中的网站?当前暂不支持外网部访问,署服务器集群目前安全组只对云主机放开,云主机暂时未提供公网访问地址。开发桌面本身当前定位是个开发态机器,建议引导往ECS、fg serverless上做部署。开发者云主机中的应用都是免费的吗?系统默认应用都是免费体验的。登录云主机后忘记了账户密码怎么办?在领取完成后系统会使用默认账号进行登录,无需设置账号密码。如果您忘记了华为账号密码可以通过账号申诉找回您的账号或者进行密码重置。开发者空间云主机可以当做我的服务器吗?云主机可以为您提供开箱即用的便捷使用体验,无法保证承担服务器相关功能,如您需要使用服务器建议购买专用服务器资源进行使用。我在哪里查看云主机体检时长是多少?可以在云主机桌面右侧的工具栏中进行查看。当前是体验阶段,为鼓励使用,进入云主机后初次体验使用时长是15小时,当剩余时长小于1小时,点击延时按钮可增加15小时的时长,每个账号的云主机使用时长为180小时/年,如果超过这个上限您可以提交工单申请延时。是否可以进行协同办公?进入云主机后,可在上方工具栏的共享桌面选项中,通过远程桌面共享、远程桌面控制,进行协同办公。是否可以同时使用基础云主机和专业云主机?可以,您可以分别在浏览器中打开基础云主机和专业云主机,两台云主机的运行互不影响。云主机可以放大缩小或者适应全屏功能吗?当前暂不支持放大缩小和适应全屏功能,敬请期待。是否可以训练大模型?当前用作免费体验的基础版云主机服务不包含GPU、NPU资源,无法支持大多数大模型的训练部署,后续会上线包含更多配置规格的云主机可以支持大模型。云主机被我搞坏了怎么办?步骤:云主机关机(已就绪)状态下,点击云主机卡片上的重置按钮,然后重新配置云主机。云主机无法连接了怎么办?请依次尝试清空浏览器缓存、更换网络、重启云主机、自主重置等步骤,若均无法连接上云主机,您可以请在开发者空间中提交工单,我们将对您的云主机产生的问题进行解决。(重置云主机将导致您的数据丢失,请慎重申请)。初次申领云主机初始化了很久还没有完成怎么办?云主机初始化需要3~5分钟,请尝试继续等待安装完成后再体验云主机。开发者云主机使用过程中提示连接断开了怎么办?您可以点击重新连接,也可以更换网络后再进行尝试,我们也会持续对云主机的连接进行优化。如何上传文件至开发者云主机?参考本地与云主机间的文件交互指南,使用云存储空间进行本地与云主机之间文件交互。云主机长时间未使用是否会回收?如果领取后长时间未使用,会对云主机资源进行回收,后续如使用,需要您重新配置云主机。内存不够用,升级是否会导致数据丢失?可以选择升级专业会员,原云主机里的内容不会丢失,但长期不开机就会被回收,专业会员的云主机在会员有效期内不会被回收。隐藏文件夹里的文件不能上传云空间,是不是问题?云存储空间没有校验文件是否是隐藏状态,只要是符合上传格式的,都可以上传。是问题。开发空间中,已就绪时看不到主机的关机按钮。已就绪状态就是已关机状态,不展示关机按钮。关闭云主机浏览器页面后会自动关机吗?关闭浏览器中的云主机页面15分钟后会自动关机。提示当前账号异常,已被限制使用怎么办?您可以请在开发者空间中提交工单,选择账号问题 ,我们将对您的云主机产生的问题进行解决。本地内容怎么复制到云主机中?通过云主机提供的剪切板。云存储空间5G的云存储空间如何使用?您可以在云存储空间右侧点击打开按钮,然后进入空间使用,上传下载文件都可以,云主机通过浏览器也可打开使用。什么时候可以使用Windows系统主机?目前正在规划中,敬请期待。请问云主机上能连云数据库么?目前暂不支持,敬请期待。云主机连续输入中文无法完整输入内容?当前云主机无法通过外部输入法完整输入长文本内容,建议使用内部输入法。云主机如何使用输入法?如何切换输入法的中英文?请确认本地的输入法为英文状态,才可调起云主机输入法;请按“shift键”进行云主机输入法中/英文切换。arm不支持复制粘贴吗?ubuntu的arm不支持复制粘贴。github网络访问延时高,可以优化吗?github这个域名解析都是海外的,访问的时候很多链路也都有问题,跨境链路网络上没有办法优化。临时规避:可以从服务器里ping下它解析的这些ip,看看哪个ip不丢包,时延小一点,就用hosts绑定上强行解析到这个ip上使用,具体ip如下:20.205.243.166140.82.121.320.27.177.1134.237.22.3820.201.28.151140.82.112.4140.82.113.420.200.245.247140.82.116.4140.82.114.320.26.156.21520.87.245.0199.59.148.9199.59.149.235点击链接,立即开通开发者空间
上滑加载中
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签