任务2.3 基于AI框架应用的开发及调优-学生手册_第1页
任务2.3 基于AI框架应用的开发及调优-学生手册_第2页
任务2.3 基于AI框架应用的开发及调优-学生手册_第3页
任务2.3 基于AI框架应用的开发及调优-学生手册_第4页
任务2.3 基于AI框架应用的开发及调优-学生手册_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务2.3基于AI框架应用的开发及调优学生手册任务2.3基于AI框架应用的开发及调优【任务导入】MDC610基于昇腾芯片,提供专用的AI框架,不仅支持多种模型的应用开发,还提供丰富的调优工具,帮助开发者更高效地优化模型性能,请从开发者的角度分析,基于AI开发的开发步骤和调优策略。【学习目标】素质目标了解华人科学家在AI领域的贡献,激发学生科技强国的责任感;通过学习基于MDC的AI框架,激发学生对人工智能的研究兴趣;通过AI模型运行时的性能解析,培养学生综合分析能力。知识目标了解性能分析解决关键途径[K23];熟悉基于MDCAI开发框架的开发方法[K24];熟悉MindStudio界面及操作方法[K25]。能力目标能使用ATC工具进行AI开发及测试[A18];能掌握Profiling结果分析并制定调优方案[A19]。【知识准备】AI集成开发工具MindStudioMDC软件开发工具链MDC(MobileDataCenter)平台是华为公司开发的智能驾驶计算平台。为构建华为MDC平台开发生态系统,平台提供了一套高效便捷、智能易用和安全可信的工具体系链,其覆盖了软件开发集成、调测、标定、路测仿真及故障诊断等汽车的全生命周期。软件开发集成工具主要包括:配置工具MDCManifestConfigurator(MMC)、应用开发工具MDCDevelopmentStudio(MDS)和AI集成开发工具MindStudio。MDC平台软件开发工具的运作流程,如REF_Ref15346\h图2-3-1所示。图2-3-SEQ图2-3-\*ARABIC1MDC集成工具运作流程MDCManifestConfigurator(MMC)MMC是MDC平台的Manifest(配置文件)配置工具,用于配置MDC软件系统(由MDC平台软件、智能驾驶功能软件和应用软件组成)。其遵循了AUTOSARAdaptivePlatform规范,对软件进行了服务化设计和抽象化设计,并对抽象后的参数进行配置,输出“.arxml”格式文件,可作为MDS工具的输入。MDCDevelopmentStudio(MDS)MDS是MDC平台的IDE(IntegratedDevelopmentEnvironment)集成开发工具,主要用来进行源码编辑、编译、调试和性能调优等。其还有一个很重要的功能,是以MDC平台的配置工具MMC输出“.arxml”格式文件作为输入,通过代码自动生成功能生成MDC平台软件与智能驾驶应用软件之间的通信框架代码,智能驾驶功能软件和应用软件再基于生成的通信框架代码进行独立开发。MindStudioMindStudio是华为面向昇腾AI开发者提供的一站式开发环境和工具集。提供端到端的昇腾AI应用开发解决方案。使开发者能够在一个工具上高效完成算子开发、训练开发和推理开发。MindStudio连接昇腾AI处理器与PC开发环境的开发工具,其部署架构图如REF_Ref19232\h图2-3-2所示。(注意:MDC610-1.1.027版本暂不支持MindStudio使用)图2-3-SEQ图2-3-\*ARABIC2部署架构图MindStudio所在的环境为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换;安装了昇腾AI处理器的环境(如MDC)为运行环境,实际运行用户开发的应用。如果需要在真实的昇腾AI处理器上运行开发的工程,则需要将MindStudio连接到运行环境,并通过运行环境和带有昇腾AI处理器的设备上的工具后台服务模块进行配合,完成所有开发工程的运行、日志和性能分析等功能。ADK开发工具包ADK(AscendDevelopmentKit)开发工具包,为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发工具包安装到MindStudio上,使用MindStudio开发工具进行算法快速开发。ADK包括ACLlib、ATC、OPP、Toolkit包。ACLlibACLlib是AI应用程序开发使用的API和运行库。包含AscendCL层及GE执行器等模块。AscendCL(ACL)提供Device管理、Context管理、Stream管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等C语言API库供用户开发深度神经网络应用,用于实现目标识别、图像分类等功能。在运行应用时,AscendCL调用GE执行器提供的接口实现模型和算子的加载与执行、调用运行管理器的接口实现Device管理/Context管理/Stream管理/内存管理等,如REF_Ref23948\h图2-3-3所示。图2-3-SEQ图2-3-\*ARABIC3AscendCL逻辑架构图ATCATC是模型和算子编译器。用于将开源框架网络模型(如TensorFlow、Caffee)或AscendIR定义的单算子描述文件(json格式)通过ATC工具转换成适配昇腾AI处理器的离线模型。(ATC工具将在“章节三ATC进行模型转换”环节做详细介绍)OPP算子库,包含算子原型库及算子实现库、算子插件、融合规则。算子实现包含TBE算子、AICPU算子,另外包含算子parser。Toolkit调测工具包,主要包含开发者调测应用、算子需要使用的工具包,例如profiling性能调试工具。MindStudio进行模型转换模型转换是进行AI应用开发的核心步骤,用户使用Caffe/TensorFlow等框架训练好的模型,可通过ATC工具将其转换为昇腾AI处理器支持的离线模型(.om模型),模型转换过程中可以实现算子调度的优化、权重数据重排、内存使用优化等,也可以脱离设备完成模型的预处理,详细架构如REF_Ref13009\h图2-3-4所示。图2-3-SEQ图2-3-\*ARABIC4ATC工具功能框架ModelInformation(配置模型信息)模型转换过程中,需要在ModelInformation页签中配置模型文件和权重文件等信息,如REF_Ref13198\h图2-3-5所示。图2-3-SEQ图2-3-\*ARABIC5ModelInformation页签ModelFile(必填)ModelFile指传入的模型文件,有两种选择方式:单击右侧的文件夹图标,在后台服务器路径选择需要转化的模型文件并上传。在参数后面的输入框中自行输入模型文件在后台服务器的路径,包括模型文件名称后缀。WeightFile(选填)WeightFile指传入的权重文件,当原始框架为Caffe时,该参数存在且必填:如果模型文件和权重文件存在于后台服务器同一目录下,且名称和模型文件名称相同,则选择模型文件后,权重文件会自动填充。如果模型文件和权重文件存在于后台服务器不同目录下,或者在同一目录下,但名称和模型文件名称不相同时,用户手动上传权重文件,方法参考ModelFile传入方式。ModelName(必填)ModelName指传入的模型文件名称,选择模型文件后,该参数会自动填充,用户可以根据需要自行修改名称,要求如下:只支持a-z、A-Z、0-9、下划线以及短划线的组合,最多支持64个字符。如果模型转换的输出路径已经存在相同名称模型文件,单击“Next”后会提示覆盖原有文件或重命名当前ModelName的信息,用户根据实际情况选择。TargetSoCVersion(必选)TargetSoCVersion指模型转换时指定的芯片版本。根据板端环境具体芯片形态进行选择,如本课程中默认使用昇腾610芯片,即选择Ascend610。InputFormat(必选)InputFormat指输入模型的数据格式,一般在传入模型时会自动识别,不同模型的数据格式为:Caffe:取值为NCHW、ND(表示支持任意格式,N<=4),默认为NCHW。MindSpore、ONNX:取值为NCHW。TensorFlow:取值为NCHW、NHWC、ND、NCDHW、NDHWC,默认为NHWC。InputNodes(必填)InputNodes指模型输入的节点信息,如果选择模型文件并且解析成功,则该参数下方会展示模型输入节点的shape信息以及指定输入节点类型信息,如REF_Ref13254\h图2-3-6所示。图2-3-SEQ图2-3-\*ARABIC6解析模型成功后生成的节点信息如果选择模型文件后,无法解析“InputNodes”,该场景下,需要用户根据模型文件中的相关信息手动输入:单击该参数右侧的,在弹出界面中输入模型输入节点的Name、Shape信息(只支持英文逗号,数字(-1或1~9))和输入节点的数据类型Type。单击删除节点信息。如果模型有多个输入,解析成功后,“InputNodes”参数下方会展示每一个输入节点的Shape和Type信息,其中:模型节点数据信息Shape根据前面选择的“InputFormat”数据格式,填入模型输入的shape信息,如选择的数据格式为“NCHW”,则此处填入的4个数值分别代表输入数据的N(模型一次处理的图片个数),C(Channel,例如彩色RGB图像的Channel数为3),H(Height),W(Width),如REF_Ref15180\h图2-3-7所示。图2-3-SEQ图2-3-\*ARABIC7查看Shape信息NCHW的具体数值可以通过单击右侧的按钮,查看该模型的原始网络结构图。(MindSpore框架的原始网络模型,不支持查看网络结构图)通过查看网络的模型输入维度,填写Shape信息,如REF_Ref15216\h图2-3-8所示。图2-3-SEQ图2-3-\*ARABIC8模型输入维度模型节点数据类型Type指定输入节点的数据类型:若原始框架类型为Caffe,支持的数据类型为FP32、FP16、Uint8。若原始框架类型为MindSpore,支持的数据类型为FP32、Uint8。若原始框架类型为ONNX,支持的数据类型为FP32、FP16、Uint8。若原始框架类型为TensorFlow,支持的输入数据类型为FP32、FP16、Uint8、Int32、Int64、Bool。当模型需要配置AIPP功能时,需要选取Type取值为Uint8才可以配置,其他类型不支持配置;如果模型有多个输入,只有Type取值为Uint8的节点的模型才可以配置。AIPP(ArtificialIntelligencePre-Processing):AI预处理,是昇腾AI处理器提供的硬件图像预处理模块,包括色域转换,图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等功能。DataPre-Processing(配置数据预处理)只有当“ModelInformation”页签,“InputNodes”参数中,输入节点的“Type”有配置为“Uint8”类型,“DataPre-Processing”页签才可以配置该节点的数据预处理功能,如REF_Ref15288\h图2-3-9所示。图2-3-SEQ图2-3-\*ARABIC9配置数据预处理AdvancedOptionsPreview(高级选项配置)高级选项配置中包含OperatorFusion、AutoTuneMode、AdditionalArguments、CommandPreview,四部分内容:OperatorFusion(融合功能)是否关闭融合功能。打开表示关闭融合功能。关闭表示开启融合功能。参数默认关闭,即默认打开融合功能。如果使用昇腾模型压缩工具量化后的模型通过模型转换得到.om离线模型,然后进行精度比对,则需要打开该开关。打开后,模型转换完毕,在生成om模型的同级目录下,会生成fusion_switch.cfg配置文件,该文件记录哪些功能被关闭。AutoTuneMode(自动调优模式)设置算子的自动调优模式。使用该功能时,请确保MindStudio和运行环境在同一台服务器。控制TBE算子编译时,是否对算子进行调优,以便在昇腾AI处理器上寻找最好的性能配置,包括如下几种模式:GeneticAlgorithm(GA):遗传算法,用于设置Cube算子的调优性能。ReinforcementLearning(RL):强化学习,用于设置Vector算子的调优性能。GeneticAlgorithmandReinforcementLearning:GA和RL调优功能同时开启。AdditionalArguments(扩展转换参数)扩展转换参数。模型转换界面不支持配置,但是ATC工具支持的参数,均可通过此选项进行扩展。最多支持输入2048个字符。CommandPreview(ATC命令)MindStudio实际上是通过图形化界面的方式完成AI模型的转换,底层逻辑也是调用了ATC工具,CommandPreview则是根据模型转换配置的生成的ATC命令预览。不支持修改。模型可视化对于已经转换成功的.om模型文件,可以在MindStudio界面呈现其网络拓扑结构,并可以查看模型所使用的算子。依次在MindStudio界面上单击菜单栏“Ascend>ModelVisualizer”,或在工具栏选择,在所示界面中选择已经转换成功的.om模型文件,单击“OK”,以resnet50.om模型文件为例,模型可视化界面如REF_Ref15350\h图2-3-10所示。图2-3-SEQ图2-3-\*ARABIC10resnet50模型可视化界面查看算子信息模型可视化界面还展示了每一层算子输出的维度和shape信息,如每一层算子连接线中间的1,224,224,4等shape信息,将鼠标移至某个shape上面,在其上面会显示算子输出的维度信息,例如NCHW以及NC1HWC0等维度,如REF_Ref15392\h图2-3-11所示。图2-3-SEQ图2-3-\*ARABIC11resnet50模型可视化界面查看模型输出节点的数据类型如果模型转换时设置了Select节点的输出类型,对应模型转换章节“ModelInformation”页签中OutputNodes区域下方节点的DataType类型,模型转换完毕,用户可以单击NetOutput节点,查看不同输入节点的数据类型,常见的数据类型如下:dtype为DT_FLOAT,表示数据类型为FP32dtype为DT_FLOAT16表示数据类型为FP16dtype为DT_UINT8表示数据类型为UINT8如果模型转换时只设置了“ModelInformation”页签中的“OutputType”参数取值,没有Select节点,则模型转换完毕,单击NetOutput节点,查看输入数据类型即可,如REF_Ref15455\h图2-3-12所示。图2-3-SEQ图2-3-\*ARABIC12模型输出数据类型查看ATC进行模型转换除了基于MindStudio的AI开发方式外,MDC系统还提供基于命令行AI开发方式。MDC610中配置的昇腾张量编译器(AscendTensorCompiler,简称ATC),是异构计算架构CANN体系下的模型转换工具,它可以将开源框架的网络模型或AscendIR定义的单算子描述文件(json格式)转换为BS9SX1AAI处理器支持的.om格式离线模型,其功能框架如REF_Ref24013\h图2-3-13所示。图2-3-SEQ图2-3-\*ARABIC13ATC工具功能框架其中ATC包含开源框架网络模型以及单算子描述文件两种使用场景。开源框架网络模型场景开源框架网络模型经过Parser解析后,转换为中间态IRGraph。中间态IR经过图准备,图拆分,图优化,图编译等一系列操作后,转成适配BS9SX1AAI处理器的离线模型。转换后的离线模型上传到板端环境,通过AscendCL接口加载模型文件实现推理过程。开发者还可以将开源框架网络模型或者转换后的离线模型转成json文件,方便文件查看。下面以ResNet-50网络模型为例,参考以下命令:原始模型文件转.om模型文件atc--model=totxt--weight=resnet50.caffemodel--framework=0--output=resnet50--soc_version=Ascend610--input_format=NCHW--input_fp16_nodes=data--output_type=FP32--out_nodes=prob:0原始模型文件转json文件atc--mode=1--om=$HOME/module/resnet50_tensorflow*.pb--json=$HOME/module/out/tf_resnet50.json--framework=3离线模型转json文件atc--mode=1--om=$HOME/module/out/tf_resnet50.om--json=$HOME/module/out/tf_resnet50.json上述命令中,atc为使用ATC工具的固定命令,--指定了使用该命令携带的参数,在模型转换过程中,常见的参数包括:--mode:指定运行模式,常用的参考值包括:0:生成适配BS9SX1AAI处理器的离线模型,模型文件格式为*.om。1:离线模型或原始模型文件转json,方便查看模型中的参数信息。3:仅做预检,检查模型文件的内容是否合法。--model:原始网络模型文件路径与文件名。(当原始模型为Caffe框架时,需要和--weight参数配合使用。)--weight:原始网络模型权重文件路径与文件名。当原始网络模型是Caffe时需要指定。--framework:原始网络模型框架类型,常见的参考值包括:0:Caffe1:MindSpore3:TensorFlow5:ONNX--input_format:输入数据格式,Caffe、MindSpore、ONNX默认为NCHW;TensorFlow默认为NHWC。其中:N(Batch数量)、H(Height,特征图高度)、W(Width,特征图宽度)、C(Channels,特征图通道)。--input_fp16_nodes:指定输入数据类型为float16的输入节点名称。--om :离线模型(.om)、原始模型文件(例如Caffe框架的.prototxt,TensorFlow框架的.pb等)、GEdump图结构文件(.txt)的路径和文件名。--output:存放转换后的离线模型的路径以及文件名,例如:$HOME/out/resnet50--output_type:指定网络输出数据类型或指定某个输出节点的输出类型,如FP32、UINT8、FP16、INT8。若提示如下信息,则说明模型转换成功,若模型转换失败,则请参见参考:MDC6101.1.027-T000产品文档/AI开发/命令行方式AI开发/ATC模型转换/参考/错误码参考,进行定位。ATCrunsuccess单算子描述文件场景AscendIR定义的单算子描述文件(json格式)通过ATC工具进行单算子编译后,转成适配BS9SX1AAI处理器的单算子离线模型,然后上传到板端环境,通过AscendCL接口加载单算子模型文件用于验证单算子功能。

【任务实施】基于ResNet-50的AI开发应用概述该AI示例工程将通过ATC工具,使用命令行的方式将Caffe框架下的ResNet-50网络结构模型在MDC上运行。其主要过程包括模型转换、编译、运行、profiling调优等。实验环境准备设备检查本次实验环境包括MDC610,电源线,安装Ubuntu20.04虚拟环境的PC机一台,见REF_Ref7828\h表2-3-1。每套实验环境适用于4~12名学生同时上机操作。表2-3-SEQ表2-3-\*ARABIC1实验清单设备名称数量备注MDC6101台所有实验组共用电源线1组所有实验组共用笔记本或台式机每组1台台式机要有无线网卡软件包准备ATC工具文件:Ascend文件夹ResNet-50项目文件:2-3resnet50文件夹文档准备MDC6101.1.027-T000产品文档.chm分析项目工程目录打开主目录/Sample/2-3resnet50工程文件夹,仔细阅读“README_CN.md”项目描述文件,该文件详细介绍了该项目的工程目录、环境要求、数据/模型准备、编译运行、关键接口介绍得内容。一般导入开源项目时,都会先阅读README.md项目描述文件,了解项目的基础信息,如REF_Ref16603\h图2-3-14所示。图2-3-SEQ图2-3-\*ARABIC14打开项目文件工程目录的主要结构如下,本项目用到的关键工程文件见REF_Ref9631\h表2-3-2。表2-3-SEQ表2-3-\*ARABIC2工程目录工程目录功能out存放编译出的可执行文件script执行数据准备脚本,将*.jpg转换为*.bindata测试数据caffe_model原始模型文件model转换后的.om模型文件.json描述文件src源文件模型转换添加环境变量打开主目录/Sample/2-3resnet50文件夹,在该文件夹目录下右键打开终端,如REF_Ref5996\h图2-3-15所示。图2-3-SEQ图2-3-\*ARABIC15打开终端在终端框中输入以下命令,在环境变量中添加ATC工具,如REF_Ref6026\h图2-3-16所示。source~/Ascend/ascend-toolkit/5.0.mdc610/atc/bin/setenv.bashsource~/Ascend/ascend-toolkit/set-env_mdc610.sh图2-3-SEQ图2-3-\*ARABIC16设置环境变量模型转换继续在终端框输入以下命令,调用ATC工具进行模型转换,若出现“ATCrunsuccess”,则说明转换模型成功,如REF_Ref11704\h图2-3-17所示。atc--model=./caffe_model/totxt--weight./caffe_model/resnet50.caffemodel--framework=0--output=./model/resnet50--soc_version=Ascend610--input_format=NCHW--input_fp16_nodes=data--output_type=FP32--out_nodes=prob:0图2-3-SEQ图2-3-\*ARABIC17模型转换生成测试数据继续在终端框输入以下命令,将.jpg图像数据文件转换成模型适配的.bin数据文件,如REF_Ref17374\h图2-3-18所示。python3.7.5./script/transferPic.py图2-3-SEQ图2-3-\*ARABIC18图像数据转换转换完成后,可在data文件夹中查看转换成功的数据文件,如REF_Ref20557\h图2-3-19所示。图2-3-SEQ图2-3-\*ARABIC19转换后的图像数据编译程序添加环境变量继续在终端框输入以下命令,将编译程序需要用到运行环境添加到环境变量中,如REF_Ref25498\h图2-3-20所示。exportDDK_PATH=/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/local/AscendexportNPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub图2-3-SEQ图2-3-\*ARABIC20添加编译的运行环境创建编译文件继续在终端框输入以下命令,在2-3resnet50下新建存放编译文件的文件夹,如REF_Ref11763\h图2-3-21所示:mkdir-pbuild/intermediates/host图2-3-SEQ图2-3-\*ARABIC21新建编译文件夹设置编译参数继续在终端框输入以下命令,先进入创建的host文件夹,并且设置CMake不在构建和安装期间为可执行文件添加运行时路径(RPATH),如REF_Ref11763\h图2-3-21所示。cdbuild/intermediates/hostcmake../../../src-DCMAKE_SKIP_RPATH=TRUE图2-3-SEQ图2-3-\*ARABIC22设置编译参数编译程序继续在终端框输入以下命令,编译程序,如REF_Ref15819\h图2-3-23所示。make图2-3-SEQ图2-3-\*ARABIC23编译程序编译成功后,可在2-3resnet/out文件夹下,查找到“main”可执行文件,如REF_Ref16361\h图2-3-24所示。图2-3-SEQ图2-3-\*ARABIC24可执行文件运行程序复制项目代码到MDC上继续在终端框输入以下命令,输入命令后需要进行密码认证,密码为Huawei12#$,将完整的resnet50项目文件复制到MDC610上,如REF_Ref15819\h图2-3-23所示。scp-r/home/eisa/Sample/2-3resnet50/root@2:/opt/usr图2-3-SEQ图2-3-\*ARABIC25复制项目文件SSH远程进入MDC设备继续在终端框输入以下命令,登录到root账户,密码为Huawei12#$,如REF_Ref29782\h图2-3-26所示。sshroot@2图2-3-SEQ图2-3-\*ARABIC26登录MDC账户在MDC上运行程序脚本继续在终端框输入以下命令,进入到2-3resnet50的out文件夹下,并用pmupload命令运行main文件,如REF_Ref29782\h图2-3-26所示。cd2-3resnet50/out/pmupload./main图2-3-SEQ图2-3-\*ARABIC27运行结果解析运行结果在终端上显示data文件夹中两张图片的识别结果,返回top5置信度的类别编号(index)和置信度(value),如REF_Ref2219\h图2-3-28所示。图2-3-SEQ图2-3-\*ARABIC28运行项目文件该样例中,传入的是“短腿猎犬”的图片(dog.bin),识别结果index为161,置信度为0.764648。结合项目文件“类别对应表.txt”查看id对应的输出项,如REF_Ref2275\h图2-3-29所示。图2-3-SEQ图2-3-\*ARABIC29输出结果解析拓展:可尝试根据“README_CN.md”文档,将.jpg格式的图片转换为.bin类的图片,通过修改输入数据,测试该模型对其他物体的识别效果。Profiling性能数据采集清空历史数据继续在终端框输入以下命令,清空历史数据,避免占用过多内存,如REF_Ref10989\h图2-3-30所示。cd/opt/usrrm-rfPROF*图2-3-SEQ图2-3-\*ARABIC30清空历史数据采集性能数据继续在终端框输入以下命令,重新运行AI应用工程,并在MDC上生成性能数据文件,如REF_Ref1150\h图2-3-30所示。cd/var./msprof--application=/opt/usr/2-3resnet50/out/main--output=/opt/usr--ascendcl=on--model-execution=on--runtime-api=on--task-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论