From 89581bde275ad39d3341bf8c17d31183044097ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=82=9C=E5=A5=95?= <918688502@qq.com> Date: Tue, 10 Jun 2025 08:11:51 +0000 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BAtar=E5=8C=85=EF=BC=8Cspec?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8CLICENSE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 194 ++++++++++++++++++++++++++++++++++++++++++++ sysHAX-0.2.0.tar.gz | Bin 0 -> 23714 bytes sysHAX.spec | 71 ++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 LICENSE create mode 100644 sysHAX-0.2.0.tar.gz create mode 100644 sysHAX.spec diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f6c2697 --- /dev/null +++ b/LICENSE @@ -0,0 +1,194 @@ +木兰宽松许可证,第2版 + +木兰宽松许可证,第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体” 是指提交贡献的机构及其“关联实体”。 + +“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是 +指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可 +以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定 +撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡 +献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软 +件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“ +关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或 +其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权 +行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定 +的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“ +本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对 +任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于 +何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文 +版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3, 请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. + +Mulan Permissive Software License,Version 2 + +Mulan Permissive Software License,Version 2 (Mulan PSL v2) + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall +be subject to Mulan PSL v2 (this License) with the following terms and +conditions: + +0. Definition + +Software means the program and related documents which are licensed under +this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular +Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its +copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its +Affiliates. + +Affiliates means entities that control, are controlled by, or are under +common control with the acting entity under this License, ‘control’ means +direct or indirect ownership of at least fifty percent (50%) of the voting +power, capital or other securities of controlled or commonly controlled +entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable copyright license to reproduce, use, modify, or distribute its +Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable (except for revocation under this Section) patent license to +make, have made, use, offer for sale, sell, import or otherwise transfer its +Contribution, where such patent license is only limited to the patent claims +owned or controlled by such Contributor now or in future which will be +necessarily infringed by its Contribution alone, or by combination of the +Contribution with the Software to which the Contribution was contributed. +The patent license shall not apply to any modification of the Contribution, +and any other combination which includes the Contribution. If you or your +Affiliates directly or indirectly institute patent litigation (including a +cross claim or counterclaim in a litigation) or other patent enforcement +activities against any individual or entity by alleging that the Software or +any Contribution in it infringes patents, then any patent license granted to +you under this License for the Software shall terminate as of the date such +litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service +marks, or product names of Contributor, except as required to fulfill notice +requirements in section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, +whether in source or executable forms, provided that you provide recipients +with a copy of this License and retain copyright, patent, trademark and +disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR +COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT +LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING +FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO +MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION +AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF +DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION +SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + +How to Apply the Mulan Permissive Software License,Version 2 +(Mulan PSL v2) to Your Software + +To apply the Mulan PSL v2 to your work, for easy identification by +recipients, you are suggested to complete following three steps: + +i. Fill in the blanks in following statement, including insert your software +name, the year of the first publication of your software, and your name +identified as the copyright owner; + +ii. Create a file named "LICENSE" which contains the whole context of this +License in the first directory of your software package; + +iii. Attach the statement to the appropriate annotated syntax at the +beginning of each source file. + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. diff --git a/sysHAX-0.2.0.tar.gz b/sysHAX-0.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..26461d24c2bbb06942425cb6fea1e130f5f14339 GIT binary patch literal 23714 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 R= 0.115.0, python3-uvicorn >= 0.23.2, python3-httpx >= 0.24.1, python3-PyYAML >= 6.0.1 + +%description +sysHAX 是 vLLM Prefill-Decode 分离调度中间层,接收客户端请求并在 GPU 实例(prefill)与 GPU/CPU 实例(decode)之间动态调度。 +通过实时监控和负载决策,在高并发场景下提升系统吞吐量。 + +%prep +%setup -q -n sysHAX +sed -i '/import yaml/a sys.path.insert(0, "%{_datadir}/sysHAX")' cli.py +sed -i 's|sys.path.insert(0, str(Path(__file__).parent))|sys.path.insert(0, "%{_datadir}/sysHAX")|' cli.py +sed -i '/^def get_version()/,/^$/c\ +def get_version() -> str:\ + return "%{version}"' cli.py + +%build +# 无需编译步骤 + +%install +# 安装应用到共享目录 +mkdir -p %{buildroot}%{_datadir}/sysHAX +cp -a %{_builddir}/%{name}/main.py %{buildroot}%{_datadir}/sysHAX/main.py +cp -a %{_builddir}/%{name}/src %{buildroot}%{_datadir}/sysHAX/ +mkdir -p %{buildroot}%{_datadir}/sysHAX/config +cp -a %{_builddir}/%{name}/config/config.example.yaml %{buildroot}%{_datadir}/sysHAX/config/config.example.yaml + +# 安装命令行脚本 syshax +install -Dm 0755 %{_builddir}/%{name}/cli.py %{buildroot}%{_bindir}/syshax + +%files +# 许可证和文档 +%license License/LICENSE +%doc README.md README.en.md + +# 应用目录 +%dir %attr(0755,root,root) %{_datadir}/sysHAX +%dir %attr(0755,root,root) %{_datadir}/sysHAX/src +%dir %attr(0755,root,root) %{_datadir}/sysHAX/config + +# 应用文件 +%attr(0644,root,root) %{_datadir}/sysHAX/main.py +%attr(0644,root,root) %{_datadir}/sysHAX/src/* +%attr(0644,root,root) %{_datadir}/sysHAX/config/config.example.yaml + +# 命令行脚本 +%attr(0755,root,root) %{_bindir}/syshax +%exclude %{_datadir}/sysHAX/__pycache__/* + +%post +# 安装后创建默认配置文件,避免运行时缺少 config.yaml +if [ ! -f %{_datadir}/sysHAX/config/config.yaml ]; then + cp %{_datadir}/sysHAX/config/config.example.yaml %{_datadir}/sysHAX/config/config.yaml +fi + +%postun -p /bin/sh +# 卸载时删除配置文件 +rm -f %{_datadir}/sysHAX/config/config.yaml + +%changelog +* Fri May 23 2025 <918688502@qq.com> - 0.2.0-1 +- Initial skeleton of the sysHAX heterogeneous collaborative acceleration runtime, including core modules, configuration management, logging system, command-line tool, API routing, application entry point, documentation, and dependency declaration -- Gitee