1 Star 0 Fork 0

王超 / ymir

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0
 
VIESC 官网 VISIT      试用申请 TRY IT OUT      SLACK社区 WELCOME
 
 

📫 使用问题反馈:contact.viesc@gmail.com / 服务器级设备专业咨询:tensor.station@gmail.com

 
 

English | 简体中文

文章引用

如要在您的工作中引用YMIR,请使用下面的Bibtex:

@inproceedings{huang2021ymir,
      title={YMIR: A Rapid Data-centric Development Platform for Vision Applications},
      author={Phoenix X. Huang and Wenze Hu and William Brendel and Manmohan Chandraker and Li-Jia Li and Xiaoyu Wang},
      booktitle={Proceedings of the Data-Centric AI Workshop at NeurIPS},
      year={2021},
}

更新内容

2.0.0版本更新时间为11/08/2022

YMIR平台

  • 新增模型性能诊断模块;
  • 新增对模型推理结果进行可视化评估的功能;
  • 新增公共算法库,内置多种高精度算法;
  • 新增一键部署功能,支持将算法部署到认证设备上;
  • 新增操作说明文档;
  • 优化代码结构。

Docker

查看更多内容 ymir-executor-fork

在公共镜像内

  • 更新yolov5训练镜像:youdaoyzbx/ymir-executor:ymir2.0.0-yolov5-cu111-tmi
  • 更新mmdetection训练镜像:youdaoyzbx/ymir-executor:ymir2.0.0-mmdet-cu111-tmi
  • 更新支持rv1126芯片部署的yolov5训练镜像:youdaoyzbx/ymir-executor:ymir2.0.0-yolov5-cu111-tmid

更多代码更新请查看 ymir-dev

硬件支持 (可选)

YYMIR支持将训练好的模型直接部署到认证设备,需要查看更多硬件参数,请查看详情

 
 

简介

目录

1. AI SUITE-YMIR介绍

YMIR(You Mine In Recursion)是一个简化的模型开发产品,专注于AI SUITE开源系列中的数据集版本和模型迭代。

 
 

目前人工智能商业化在算力、算法和技术方面达到阶段性成熟。AI应用在产品落地过程中经常会遇到无法大规模扩展的瓶颈,例如人才紧缺、开发成本高、迭代周期长等问题。

在此基础上,为了降低企业利用AI技术的成本,加速推进AI赋能企业,YMIR系统为算法人员提供端到端的算法研发工具,围绕AI开发过程中所需要的数据处理、模型训练等业务需求提供一站式服务,推动算法技术应用。

YMIR主要以数据为中心,提供高效模型开发迭代能力,集成了主动学习方法、数据和模型版本控制,同时集成工作空间等概念,实现多个任务特定数据集的并行快速迭代。平台设计开放API来集成第三方工具,支持企业将有限的人力投入到应用的开发中,以更低成本实现AI到行业的落地。

1.1. 主要功能

在AI开发过程中,基本流程通常可以归纳为几个步骤:确定目的、准备数据、训练模型、评估模型、部署模型。

  • 确定目的:在开始AI开发之前,必须明确要分析什么?要解决什么问题?商业目的是什么?基于商业的理解,整理AI开发框架和思路。例如,图像分类、物体检测等。不同的项目对数据的要求,使用的AI开发手段也是不一样的。
  • 准备数据:数据准备主要是指收集和预处理数据的过程。按照确定的分析目的,有目的性的收集、整合相关数据,数据准备是AI开发的一个基础。此时最重要的是保证获取数据的真实可靠性。而事实上,不能一次性将所有数据都采集全,因此需要反复新增数据来调整优化。
  • 训练模型:俗称“建模”,指通过分析手段、方法和技巧对准备好的数据进行探索分析,从中发现因果关系、内部联系和业务规律,为商业目的提供决策参考。训练模型的结果通常是一个或多个机器学习或深度学习模型,模型可以应用到新的数据中,得到预测、评价等结果。
  • 评估模型:训练得到模型之后,整个开发过程还不算结束,需要对模型进行评估和考察。通过现有的数据往往不能一次性获得一个满意的模型,需要反复的调整算法参数,新增有效数据,不断地迭代和评估生成的模型。一些常用的指标,如mAP,能帮助您有效的评估,最终获得一个满意的模型。
  • 部署模型:模型的开发训练,是基于之前的已有数据(有可能是测试数据),而在得到一个满意的模型之后,需要将其应用到正式的实际数据或新产生数据中,进行预测、评价、或以可视化和报表的形式把数据中的高价值信息以精辟易懂的形式提供给决策人员,帮助其制定更加正确的商业策略。

YMIR平台主要满足用户规模化生产模型的需求,为用户提供良好、易用的展示界面,便于数据和模型的管理与查看。平台包含项目管理、标签管理、系统配置等主要功能模块,支持实现以下主要功能:

功能模块 一级功能 二级功能 功能说明
项目管理 项目管理 项目编辑 支持添加、删除、编辑项目及项目信息
项目管理 迭代管理 迭代准备 支持设置迭代所需要的数据集和模型信息
项目管理 迭代管理 迭代步骤 支持将上一轮的数据填充到下一步对应的任务参数中
项目管理 迭代管理 迭代图表 支持将迭代过程中产生的数据集和模型按图表比对的方式展示在界面中
项目管理 数据集管理 导入数据集 支持用户通过复制公共数据集、url地址、路径导入以及本地导入等方式导入准备好的数据集
项目管理 数据集管理 查看数据集 支持图片数据及标注的可视化查看、以及历史信息的查看
项目管理 数据集管理 编辑数据集 支持数据集的编辑、删除
项目管理 数据集管理 数据集版本 支持在源数据集上创建新的数据集版本,版本号按时间递增
项目管理 数据集管理 数据预处理 支持图片数据的融合、筛选、采样操作
项目管理 数据集管理 数据挖掘 支持在海量数据集中找到对模型优化最有利的数据
项目管理 数据集管理 数据标注 支持为图片数据添加标注
项目管理 数据集管理 数据推理 支持通过指定模型为数据集添加标注
项目管理 模型管理 模型导入 支持本地导入模型文件到平台
项目管理 模型管理 训练模型 支持自选数据集、标签,并根据需求调整训练参数来训练模型,完成后可查看对应的模型效果
项目管理 模型管理 模型验证 支持上传单张图片,通过可视化的方式查看模型在真实图片中的表现,以校验模型的精确度
标签管理 标签管理 新增标签 支持训练标签的主名和别名的添加
模型部署 算法管理 公共算法 支持算法定制化、查看公共算法并试用,支持添加到我的算法中
模型部署 算法管理 公共算法 支持发布我的算法到公共算法
模型部署 算法管理 我的算法 支持查看和编辑我发布的算法和已添加的算法
模型部署 算法管理 部署算法 支持部署我的算法到设备上、查看部署历史
模型部署 设备管理 查看设备 支持设备信息和部署历史的查看
模型部署 设备管理 编辑设备 支持设备的添加、部署、删除
模型部署 设备管理 支持设备 支持对支持设备的查看和购买
系统配置 镜像管理 我的镜像 支持添加自定义镜像到系统中(仅管理员可用)
系统配置 镜像管理 公共镜像 支持查看其他人上传的公共镜像并复制到自己的系统中
系统配置 权限配置 权限管理 支持对用户的权限进行配置(仅管理员可用)

1.2. 申请试用

我们提供一个在线的体验版本,方便您试用,如有需要,请填写YMIR在线系统申请试用表,我们会将试用信息发送至您的邮箱。

2. 安装

用户如何选择安装GUI or CMD:

1.普通用户推荐安装GUI,支持模型的训练、优化完整流程;

2.如需要修改系统默认的配置,推荐安装CMD;

3.如已经部署ymir的已有版本,请参考升级说明

本章节为YMIR-GUI的安装说明,如需使用CMD,请参考Ymir-CMD line使用指南

2.1. 环境依赖

  1. GPU版本需要GPU,并安装nvidia驱动: https://www.nvidia.cn/geforce/drivers/

  2. 需要安装 docker 及 docker compose:

## 通过nvidia-smi查看主机显卡驱动支持的最高cuda版本
nvidia-smi
## 对支持CUDA11以上版本的主机, 检查nvidia-docker是否安装成功
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
## 对支持CUDA10的主机, 检测nvidia-docker是否安装成功
sudo docker run --rm --gpus all nvidia/cuda:10.2-base-ubuntu18.04 nvidia-smi
## 上述命令在终端应输出类似以下的结果 (最高支持cuda 11.6)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.60.02    Driver Version: 510.60.02    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P4            Off  | 00000000:0B:00.0 Off |                    0 |
| N/A   62C    P0    55W /  75W |   4351MiB /  7680MiB |     94%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      8132      C                                    4349MiB |
+-----------------------------------------------------------------------------+
  1. 推荐服务器配置:
  • NVIDIA GeForce RTX 2080 Ti 12G
  • 显存最大值到达9974MiB
  • 显卡驱动支持的最高CUDA 版本 >= 11.2

2.2. 安装 YMIR-GUI

需要保证环境依赖中所有条件已满足才能部署,否则容易出现各种不可控问题。

YMIR-GUI项目包在DockerHub上,安装部署YMIR步骤如下:

  1. 登录Git地址:https://github.com/IndustryEssentials/ymir

将部署项目YMIR下拉到本地服务器,克隆仓库地址命令: git clone https://github.com/IndustryEssentials/ymir.git

  1. 如无可用显卡,用户需要安装CPU模式,请修改为CPU启动模式,修改.env文件将SERVER_RUNTIME参数修改为runc:

# nvidia for gpu, runc for cpu.

SERVER_RUNTIME=runc

  1. 执行启动命令:bash ymir.sh start,建议不要使用sudo命令,否则可能会造成权限不足。
  • 服务启动时会询问用户是否愿意发送使用报告到YMIR开发团队,不输入默认为愿意。
  • 当询问用户是否需要启动标注平台时,用户可以选择 label_free 或 label_studio
  • YMIR的模型部署模块默认端口号为18801,如有冲突需要修改,则需要前往YMIR目录下修改.env文件,配置 ModelDeployment 端口和 MySQL 访问密码:
DEPLOY_MODULE_HOST_PORT=18801
DEPLOY_MODULE_URL=${DEPLOY_MODULE_HOST_PORT}
DEPLOY_MODULE_MYSQL_ROOT_PASSWORD=deploy_db_passwd

修改完成后再执行启动命令:bash ymir.sh start

  1. 服务启动成功后,默认配置端口为12001,可以直接访问 http://localhost:12001/ 显示登录界面即安装成功。如果需要停止服务,运行命令为:bash ymir.sh stop

  2. 默认初始用户权限为超级管理员,可以通过项目路径下.env文件查看账号密码,部署前可自行设置修改。建议在服务部署完成后,通过用户管理界面修改密码。

 

6.进入.env 文件配置,设置发信邮箱信息,配置完成后才可以发送邮件通知。

# Email Notification
EMAILS_ENABLED=True
FRONTEND_ENTRYPOINT=<YMIR FRONTEND URL>
SMTP_TLS=
SMTP_PORT=
SMTP_HOST=
SMTP_USER=
SMTP_PASSWORD=
EMAILS_FROM_EMAIL= <SENDER EMAIL ADDRESS>
EMAILS_FROM_NAME=ymir-project
EMAIL_RESET_TOKEN_EXPIRE_HOURS=1
EMAIL_TEMPLATES_DIR=/app/email-templates/build

2.3. 安装配置LabelStudio (可选)

label studio同时也是YMIR所支持的外接标注系统,可以作为备选标注工具安装。

  1. 在上一节的YMIR目录下,修改.env文件,配置 LABEL_TOOL
LABEL_TOOL=label_studio
  1. 配置好标注工具(LABEL_TOOL)后启动安装 label studio 命令如下:
docker-compose -f docker-compose.label_studio.yml up -d
  1. 完成后查看label studio状态命令如下:
docker-compose -f docker-compose.label_studio.yml ps`

可以登录默认地址 http://localhost:8763/ 显示登录界面即安装成功。

  1. 停止label studio服务命令如下:
docker-compose -f docker-compose.label_studio.yml down

3. GUI使用-典型模型生产流程

YMIR-GUI process

数据和标签是深度学习模型训练的必要条件,模型的训练需要大量带标签的数据。然而在实际情况下,现实中存在的是大量没有标签的数据,如果全部由标注人员手工打上标签,人力和时间成本过高。

因此,YMIR平台通过主动学习的方法,首先通过本地导入或者少量数据来训练出一个初始模型,使用该初始模型,从海量数据中挖掘出对模型能力提高最有利的数据。挖掘完成后,仅针对这部分数据进行标注,对原本的训练数据集进行高效扩充。

使用更新后的数据集再次训练模型,以此来提高模型能力。相比于对全部数据标注后再训练,YMIR平台提供的方法更高效,减少了对低质量数据的标注成本。通过挖掘,标注,训练的循环,扩充高质量数据,提升模型能力。

本次使用一次模型迭代的完整流程来说明YMIR平台的操作过程。具体的操作流程请查看操作说明

4. 进阶版:Ymir-CMD line使用指南

本章节为YMIR-CMD line的使用说明,如需安装和使用GUI,请参考GUI安装说明

4.1 安装

方式一:通过pip安装

# Requires >= Python3.8.10
$ pip install ymir-cmd
$ mir --vesion

方式二:通过源码安装

$ git clone --recursive https://github.com/IndustryEssentials/ymir.git
$ cd ymir/ymir/command
$ python setup.py clean --all install
$ mir --version

4.2 典型模型生产流程

流程-中文

上图所示的是模型训练的一个典型流程:用户准备好外部数据,导入本系统,对数据进行适当筛选,开始训练得到一个(可能是粗精度的)模型,并依据这个模型,在一个待挖掘数据集中挑选适合进一步训练的图片,将这些图片进行标注,标注完成的结果与原训练集合并,用合并以后的结果再次执行训练过程,得到效果更好的模型。 在这一节里,我们需要使用命令行实现上图所示的流程,其他流程也可以类似实现。具体操作请查看命令行使用说明

5. 获取代码

5.1 代码贡献

YMIR repo中的任何代码都应遵循编码标准,并将在CI测试中进行检查。

  • 功能性代码需要进行单元测试。

  • 在提交前使用 flake8black 来格式化代码。 这两者均遵循 PEP8Google Python Style 风格指南。

  • mypy - Python必须经过静态类型检查。

也可以查看 MSFT编码风格 来获取更多的建议。

5.2 关于训练,推理与挖掘镜像,以及模型包结构

查看这篇文档获取更多有关训练,推理与挖掘镜像的细节。

查看这篇文档 获取更多关于模型包数据结构的细节。

6. 设计理念

我们使用Git中代码版本控制的概念来管理我们的数据和模型。我们使用分支的概念创建新项目,以便同一组映像上的不同任务可以并行运行。数据集的增加、检索、更新和删除以及基本操作都创建提交到分支。从逻辑上讲,每次提交都存储数据集或新模型的更新版本,以及导致此更改的操作的元数据。最后,只有数据更改被合并到主分支,这在概念上,聚合了该平台上许多项目注释的所有数据。具体设计理念请查看 Life of a dataset

7.MISC

7.1 常见问题

  • 为什么上传本地数据集的压缩包失败?

无论是否有标签,必须创建images文件夹和annotations文件夹。图像放入images文件夹下,格式限为jpg、jpeg、png。标注文件放入annotations文件夹下,格式为pascal(无标注文件,annotations文件夹为空)。将images,annotations放入同一文件夹下,并压缩为.zip压缩包(非.rar压缩格式)。

  • 应该如何取得训练和挖掘的配置文件?

默认配置文件模板需要在镜像中提取。

训练镜像 industryessentials/executor-det-yolov4-training:release-0.1.2 的配置文件模板位于:/img-man/training-template.yaml

挖掘与推理镜像 industryessentials/executor-det-yolov4-mining:release-0.1.2 的配置文件模板位于:/img-man/mining-template.yaml(挖掘) 以及 /img-man/infer-template.yaml(推理)

  • 如何在系统外部使用训练出来的模型?

成功完成训练后,系统会输出模型的 id,用户可以根据这个 id 到 --model-location 位置找到对应的文件,它事实上是一个 tar 文件,可以直接使用 tar 命令解压,得到 params 和 json 格式的 mxnet 模型文件。

  • 在windows系统遇到部署、调试、运行问题如何解决?

尚未在Windows服务器完备测试,暂时无法提供服务支持。

  • 如何导入外部模型

参考此文档

All Contributors

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Industry Essentials Corp. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

ymirymirymir 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/wangchao-cn/ymir.git
git@gitee.com:wangchao-cn/ymir.git
wangchao-cn
ymir
ymir
master

搜索帮助