文件最后提交记录最后更新时间
[新需求]新增aclgraph model base + qwen3 部分内容 + tokenizer wrapper、json completor Co-authored-by: stanzzzzz<zonghaoxin@huawei.com> # message auto-generated for no-merge-commit merge: !178 merge 0108aclgraphTodev into dev [新需求]新增aclgraph model base + qwen3 部分内容 + tokenizer wrapper、json completor Created-by: stanzzzzz Commit-by: stanzzzzz Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 Fix part of https://gitcode.com/Ascend/MindIE-LLM/issues/103 # 修改内容 1. model input builder 基类实现和qwen3 子类实现,用于构建符合模型要求的输入格式。 2. model reasoning parser 基类实现和qwen3 子类实现,处理推理内容。 3. model tool calls processor 基类实现和qwen3 子类实现,处理工具调用。 4. tokenizer wrapper 封装类实现,提供输入编码和输出解码接口。 5. json 补全器 json completor 工具类实现 # 资料变更 不涉及 # 接口变更 不涉及 # 测试结果 deepseek v32 ,可正常拉起服务化,发送请求正常返回,精度正常: ``` curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{ "model": "ds_v3.2", "messages": [ {"role": "user", "content": "你是谁?"} ], "stream": false, "ignore_eos": false, "max_tokens": 64 }' http://127.0.0.1:10010/v1/chat/completions {"id":"endpoint_common_0","object":"chat.completion","created":1767838406,"model":"ds_v3.2","choices":[{"index":0,"message":{"role":"assistant","content":"我是DeepSeek,由深度求索公司创造的AI助手。很高兴为你解答问题,提供帮助!😊","tool_calls":[]},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":6,"prompt_tokens_details":{"cached_tokens":0},"completion_tokens":25,"completion_tokens_details":{"reasoning_tokens":0},"total_tokens":31,"batch_size":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"queue_wait_time":[536,682,422,1371,368,257,1247,781,830,815,859,1228,1592,670,433]},"prefill_time":2153,"decode_time_arr":[291,291,140,140,140,213,213,420,210,210,208,208,220,220,451,478,445,460,155,155,155,493,232,232]} ``` qwen3 32B 可以正常拉起服务化,发送请求可以正常返回,精度正常 ``` curl --request POST --url http://127.0.0.1:1025/v1/chat/completions --header 'Content-Type: application/json' --data '{ "model":"qwen", "messages":[{ "role": "system", "content": "以梦里花落知多少作为开头,续写一首七言律诗" }], "chat_template_kwargs":{"enable_thinking":true}, "stream": false, "temperature": 0.95, "max_tokens":2048 }' {"id":"endpoint_common_0","object":"chat.completion","created":1767797790,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n好的,用户让我以“梦里花落知多少”开头续写一首七言律诗。首先,我需要确认七言律诗的格式要求。七律通常有八句,每句七个字,讲究平仄对仗,中间两联需要对仗工整,押韵一般用平声韵。\n\n接下来,分析原句“梦里花落知多少”。这句诗带有淡淡的哀愁和回忆的感觉,可能涉及离别、时光流逝的主题。我需要延续这种意境,同时展开后续的内容。\n\n首先确定押韵的韵脚。原句的“少”在这里需要注意,因为“少”在平水韵中属于小韵,可能需要调整。不过用户可能更在意现代汉语的押韵,所以可能需要选择“少”对应的韵母,比如“ao”韵,但七律通常要求一韵到底,可能需要调整用词。或者可能用户没有严格遵循古韵,可以适当放宽。\n\n接下来考虑内容的发展。第一句是梦境中的花落,可能引出回忆或者对过去的感慨。中间两联需要对仗,比如第二联和第三联。比如可以写现实中的景象与梦中的对比,或者时间的流逝带来的变化。\n\n比如第二联可以写现实中的景物,比如柳絮、燕呢喃,与梦中的花落形成对比。第三联可以转到更深层次的情感,比如离别后的孤独,或者岁月的变迁。\n\n最后两句需要收束全诗,可能表达一种无奈或者希望。比如问碧海青天,或者寻找答案。\n\n然后检查对仗是否工整,平仄是否符合要求。可能需要调整用词,确保每联的对仗工整,比如“柳线摇风”对“燕声剪水”,“离舟”对“旧信”,“云外”对“灯前”。\n\n最后检查押韵是否一致,通常七律押平声韵,所以“少、娇、娇、聊、天”需要确认是否在同一韵部。可能需要调整最后一个韵脚,使其一致。比如“天”是否和之前的韵脚押韵,可能需要换成“遥”或者其他字。\n\n可能还需要润色诗句,使意境更连贯,情感更统一。例如,确保每句之间有逻辑联系,从梦到现实,再到情感的抒发,最后以问句或感叹结尾,增强余韵。\n</think>\n\n《七律","tool_calls":[]},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":25,"prompt_tokens_details":{"cached_tokens":0},"completion_tokens":512,"completion_tokens_details":{"reasoning_tokens":507},"total_tokens":537,"batch_size":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"queue_wait_time":[5441,401,774,1138,978,255,307,252,227,355,368,297,250,308,370,356,436,327,822,337,792,902,686,304,340,406,354,328,869,389,1066,302,102,149,291,346,269,131,585,1088,175,162,279,377,302,334,185,140,659,1007,933,847,255,246,730,819,513,341,252,304,341,454,111,362,359,536,1063,940,763,195,70,76,205,1073,1098,130,1062,242,147,136,814,560,82,945,638,1082,328,718,669,412,177,776,789,1073,1060,423,494,381,1048,165,666,629,175,1001,373,1100,267,167,1011,89,152,1103,1097,224,250,91,934,298,217,493,1108,149,643,1155,912,133,192,1040,476,341,773,1074,1080,984,581,918,866,878,1108,1095,525,951,903,170,124,79,83,1070,697,282,758,307,1150,249,1027,451,652,479,790,601,672,446,126,119,139,96,935,744,590,207,781,445,871,134,152,93,608,928,469,476,1014,710,1021,421,902,664,876,1000,89,195,180,166,1103,86,1070,130,644,152,49,76,1028,127,1087,155,132,88,1022,917,190,165,125,1096,764,1102,169,86,803,330,131,139,70,115,958,743,53,116,101,110,83,85,84,103,1074,185,53,125,69,142,81,113,76,990,70,833,761,1094,1026,714,62,993,843,660,498,71,1099,69,74,1123,978,72,123,125,1038,908,124,1006,899,173,154,113,131,135,1088,134,196,190,134,143,1081,1007,160,189,92,1072,1049,1012,102,841,841,163,148,148,211,231,141,753,592,99,251,194,182,210,132,742,368,154,1056,905,153,142,962,746,513,1076,784,801,225,66,1050,1015,973,1108,1032,1037,168,182,162,134,81,164,817,553,328,730,829,833,1026,865,577,924,999,804,942,1071,957,953,986,1071,57,128,496,964,960,995,957,1067,984,1067,828,1019,1026,1027,760,653,516,655,491,878,823,830,1006,508,824,812,148,831,555,935,836,647,377,804,911,602,276,868,724,862,838,883,1016,994,937,881,872,1102,1107,188,405,884,826,1029,1035,127,187,164,1106,1097,70,132,96,159,1084,1043,865,153,119,1135,668,446,1061,521,737,952,786,494,976,167,388,920,896,591,723,1002,684,441,898,766,923,1015,929,902,667,325,907,876,694,783,939,919,878,549,933,843,874,899,665,85,163,673,473,557,749,686,825,858,721,646,697,942,612,426,619,779,571,325,186,235,712,404,707,171,1134,444,225,146,227,255,368,909,670,576,1007,179,1034,769,953,252,411,207,960,1091,896,986,406,749,723,1015,262,680,310,284]},"prefill_time":166,"decode_time_arr":[56,37,38,37,36,36,36,36,36,37,36,36,36,36,36,37,37,38,37,37,38,37,36,36,36,36,37,38,37,37,37,36,36,36,36,37,37,37,37,36,36,36,37,36,37,38,38,37,38,38,37,36,37,38,38,37,37,36,36,37,37,36,37,37,37,39,38,37,38,36,36,37,37,37,37,38,37,36,37,38,37,37,38,38,39,37,38,38,38,37,37,38,39,38,37,38,38,38,37,39,38,37,38,37,37,37,37,37,36,37,37,37,36,37,37,37,37,37,37,37,37,38,38,37,36,37,38,38,37,37,38,38,38,37,38,38,37,38,38,37,38,39,37,37,36,37,38,39,37,38,38,39,38,39,38,39,40,38,38,39,38,37,36,37,40,38,38,37,37,38,37,37,36,36,37,38,38,38,37,38,38,38,37,38,37,37,37,36,36,36,37,37,37,37,37,37,37,36,37,37,37,37,36,36,37,38,37,36,36,37,38,37,37,37,37,38,37,36,37,36,37,38,37,36,36,36,36,36,36,36,37,38,37,36,36,36,36,36,36,37,37,37,38,37,38,38,37,37,38,38,38,37,36,37,36,36,38,37,36,36,37,38,37,37,38,37,36,36,36,36,37,37,36,36,36,36,37,38,37,36,37,37,38,38,37,37,38,37,36,36,36,36,37,37,38,37,36,36,36,36,37,37,38,37,37,38,37,36,37,38,38,37,38,37,37,37,37,38,38,37,38,37,37,36,36,36,36,36,37,38,38,38,38,39,38,39,39,38,38,39,38,38,39,39,39,38,39,37,37,37,38,37,38,37,38,37,38,37,38,37,38,39,39,38,39,38,39,40,39,39,38,39,39,38,38,37,38,38,38,37,37,38,39,37,38,37,38,37,37,38,38,38,38,38,38,38,37,37,38,37,38,37,36,36,37,38,37,36,36,36,37,38,38,37,36,37,38,38,38,40,38,38,39,39,39,39,37,37,38,38,37,37,38,38,37,38,37,37,38,38,38,38,37,38,38,37,37,38,38,38,37,38,37,37,38,38,37,37,38,37,37,38,37,37,38,38,37,37,39,38,37,37,38,38,38,37,37,39,39,38,39,39,3 ``` # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [x] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [ ] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [ ] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!1784 个月前
[feat] [aclgraph] rope重构 + 支持DeepSeekv3.2&Qwen2/3 yarn外推 Co-authored-by: zhaokerui<zhaokerui@huawei.com> # message auto-generated for no-merge-commit merge: !285 merge long_seq into dev [feat] [aclgraph] rope重构 + 支持DeepSeekv3.2&Qwen2/3 yarn外推 Created-by: zhaokerui Commit-by: zhaokerui Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > Fixes #235 # 修改内容 本次 PR 新增了完整的 RoPE(旋转位置嵌入)模块,提供可扩展的旋转位置嵌入实现框架: **核心新增文件:** 1. **base.py** - 基础 RoPE 实现,提供旋转位置嵌入的核心功能,支持 NPU 加速,包含 cos/sin 缓存预计算和位置索引 2. **yarn_scaling_rope.py** - YaRN(Yet another RoPE extensioN)扩展实现,支持长上下文推理,通过频率混合和幅度缩放实现平滑的上下文扩展 3. **deepseek_v3_yarn_scaling_rope.py** - DeepSeek-V3 特定实现,基于 YaRN 添加 mscale_all_dim 参数,实现更精细的注意力幅度控制 4. **registry.py** - RoPE 工厂注册表和缓存机制,支持按配置创建和复用 RoPE 实例,提供装饰器 @register_rope_type 用于注册新的 RoPE 类型 5. **__init__.py** - 模块主入口,注册三种 RoPE 类型(default、yarn、deepseek_yarn),提供统一的 get_rope() 接口,根据配置自动选择合适的实现 **模型适配:** - DeepSeek-V3-32B 和 Qwen3-32B 模型已完成适配,各自定义专属的 RopeScaling 配置类 **支持场景:** - 同步推理 - 异步推理 - 同步推理 + MTP(DeepSeek-V3-32B) # 资料变更 > 新增开发者文档RoPE Factory 使用指南,指导其他模型使用框架测的rope相关工具。 # 接口变更 > “不涉及”。 # 测试结果 > gsm8k 数据集,qwen3-32B浮点精度结果95.68、 deepseekv3.2精度93.25. > 性能:qwen3-32b dsv32 同步+MTP、同步、异步性能与合入前保持一致 # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [x] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [x] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [x] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!2852 个月前
dsv32 fc bugfix: 1)修复非流式精度问题 2) 修复rotQuant权重下bfcl精度问题 Co-authored-by: xsxhw<xiaoshixiang2@huawei.com> # message auto-generated for no-merge-commit merge: !825 merge dsv32fc into dev dsv32 fc bugfix: 1)修复非流式精度问题 2) 修复rotQuant权重下bfcl精度问题 Created-by: xsxhw1 Commit-by: xsxhw Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意:Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 DeepSeek-V3.2-w8a8-mtp-QuaRot,bfcl simple数据集: 非流式: The markdown format results is as below: | dataset | version | metric | mode | vllm-api-function-call-chat | |----- | ----- | ----- | ----- | -----| | BFCL-v3-simple | c1b9d1 | accuracy | bfcl_v3 | 0.94 (378.0/400.0) | 流式: | dataset | version | metric | mode | vllm-api-function-call-chat | |----- | ----- | ----- | ----- | -----| | BFCL-v3-simple | c1b9d1 | accuracy | bfcl_v3 | 0.94 (378.0/400.0) | # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [ ] 代码注释完备 - [ ] 正确记录错误日志 - [ ] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [ ] 进行了空指针校验 - [ ] 若存在资源申请,使用后资源被正确的释放了 - [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [ ] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [ ] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!8251 个月前
w8a8sc权重加载逻辑迁移至权重预加载路线 Co-authored-by: frost_mourne<suyuxuan3@h-partners.com> # message auto-generated for no-merge-commit merge: !406 merge dev into dev w8a8sc权重加载逻辑迁移至权重预加载路线 Created-by: frost_mourne Commit-by: frost_mourne Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 w8a8sc量化权重加载逻辑从原有路线迁移至显存预分配路线。 Fixes #176 #238 # 修改内容 1.quant_method_adapter.py添加W8A8SCLinearMethod。 2.qwen2_config.py中增加权重文件与模型结构的双向映射表及格式转换的方法。 3.embedding.py处理lmhead分别对应linear和embedding的转换。 4.w8a8sc.py处理w8a8sc权重注册和格式判断。 5.default_model_loader.py和weight_utils.py增加w8a8sc格式权重加载逻辑。 6.前作https://gitcode.com/Ascend/MindIE-LLM/pull/266/在default_model_loader.py中误将get_mapper_cls函数放在w8a8sc判断之外,导致非Qwen3模型会误入get_mapper_cls函数并报NotImplementedError: The model type of qwen2 has not implemented W8A8SC quant method yet错误,本作将get_mapper_cls函数移入w8a8sc判断内,并测试其他模型功能正常。 # 资料变更 不涉及 # 接口变更 不涉及 # 测试结果 对比同一个版本原始代码与加上本PR后的代码,分别开启服务化用aisbench测gsm8k数据集。开启前与开启后精度分别为25.40、25.70。测试不影响Qwen3 w8a8、Qwen3 浮点、Qwen2.5浮点、Qwen2.5 w8a8sc功能。 # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [x] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [x] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [x] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!4062 个月前
w8a8sc权重加载逻辑迁移至权重预加载路线 Co-authored-by: frost_mourne<suyuxuan3@h-partners.com> # message auto-generated for no-merge-commit merge: !406 merge dev into dev w8a8sc权重加载逻辑迁移至权重预加载路线 Created-by: frost_mourne Commit-by: frost_mourne Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 w8a8sc量化权重加载逻辑从原有路线迁移至显存预分配路线。 Fixes #176 #238 # 修改内容 1.quant_method_adapter.py添加W8A8SCLinearMethod。 2.qwen2_config.py中增加权重文件与模型结构的双向映射表及格式转换的方法。 3.embedding.py处理lmhead分别对应linear和embedding的转换。 4.w8a8sc.py处理w8a8sc权重注册和格式判断。 5.default_model_loader.py和weight_utils.py增加w8a8sc格式权重加载逻辑。 6.前作https://gitcode.com/Ascend/MindIE-LLM/pull/266/在default_model_loader.py中误将get_mapper_cls函数放在w8a8sc判断之外,导致非Qwen3模型会误入get_mapper_cls函数并报NotImplementedError: The model type of qwen2 has not implemented W8A8SC quant method yet错误,本作将get_mapper_cls函数移入w8a8sc判断内,并测试其他模型功能正常。 # 资料变更 不涉及 # 接口变更 不涉及 # 测试结果 对比同一个版本原始代码与加上本PR后的代码,分别开启服务化用aisbench测gsm8k数据集。开启前与开启后精度分别为25.40、25.70。测试不影响Qwen3 w8a8、Qwen3 浮点、Qwen2.5浮点、Qwen2.5 w8a8sc功能。 # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [x] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [x] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [x] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!4062 个月前
model_runner重构 Co-authored-by: LostFox11<wangziyue17@huawei.com> Co-authored-by: huanglei1<huanglei1@huawei.com> Co-authored-by: Katrina-CXY<chenxinyi20@huawei.com> Co-authored-by: xsxhw1<xiaoshixiang2@huawei.com> # message auto-generated for no-merge-commit merge: !255 merge mid into dev model_runner重构 Created-by: LostFox11 Commit-by: LostFox11;Katrina-CXY;stanzzzzz;xsxhw1;huanglei1 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 重构model_runnner 支持异步 # 修改内容 > 1.区分h2d与d2d场景 支持异步以及与其他特性叠加 2.泛化metadata,支持各特性持有自己的参数与方法 3.使用batch_descriptor选图 4.eager mode支持padding 5.新增input_buffer存储固定入图地址 6.修改sampler 下沉为layers里面的实例 直接返回device tensor 7.修改plugin_manger的exp逻辑 将fill_in_model_result放到forward_loop 即第二条流 8.修改seq_lens_list的计算逻辑,取消不必要同步操作,减小异步空泡 9.修改forward_context以及持有的attn_metadata的构造逻辑 统一使用model_input构造 # 资料变更 > 不涉及。 # 接口变更 > 不涉及 # 测试结果 > 新model_runner dsv3.2 dp+tp+ep `curl http://localhost:7070/v1/chat/completions -d '{ "model": "ds_v3.2", "messages": [ {"role": "user", "content": "告诉我大模型推理中的vllm的具体实现细节"} ], "stream": false, "max_tokens": 1024 }' {"id":"endpoint_common_0","object":"chat.completion","created":1768983661,"model":"ds_v3.2","choices":[{"index":0,"message":{"role":"assistant","content":"好的,我来详细解释一下 **vLLM(Virtual Large Language Model)** 的具体实现细节。\n\nvLLM 是一个旨在**高效服务大型语言模型(LLM)**的系统,其核心思想是通过**虚拟化**技术来优化内存管理和推理过程。下面我们从几个关键方面来分解它的实现:\n\n---\n\n### 1. 核心问题:传统LLM服务的内存瓶颈\n\n大型语言模型(如GPT-3规模模型)的主要挑战是:\n* **内存占用巨大**:模型参数(权重)需要大量GPU内存。\n* **注意力机制内存开销**:推理过程中,Key-Value(KV)缓存随着序列长度增长而线性增长,尤其对于长上下文模型,这成为主要瓶颈。\n\n传统方法:\n* 将整个模型加载到GPU内存。\n* 每次推理为整个序列分配KV缓存。\n* 结果:单个GPU只能服务较小模型或短序列,或者需要多GPU并行,但效率低。\n\n---\n\n### 2. vLLM的虚拟化思想\n\nvLLM通过“虚拟化”来解决这个问题,意思是**它并不在物理内存中实际存储全部所需数据,而是按需动态加载和卸载**。\n\n具体虚拟化两个方面:\n\n#### **2.1 模型权重虚拟化(PagedModel)**\n\n灵感来自操作系统的**分页内存管理**:\n* 将庞大的模型权重(参数)划分为多个“页”(blocks)。\n* 仅将当前推理所需的部分“页”加载到GPU内存。\n* 不需要的“页”可卸载到成本较低的CPU内存或甚至磁盘。\n* 通过一个“页表”(block table)来管理这些页的映射和调度。\n\n**实现细节**:\n* **划分策略**:根据模型结构(如Transformer层的线性顺序)自然划分页。通常按层或层的部分划分。\n* **调度策略**:根据请求的推理进度(已处理到的层)预测下一所需页,预加载。\n* **换入换出**:当GPU内存不足时,将最远页换出到CPU内存。\n\n这样,**单个GPU可以服务一个物理内存装不下的更大模型**。\n\n#### **2.2 KV缓存虚拟化(PagedAttention)**\n\n这是vLLM最著名和核心的创新!\n\n注意力机制中的KV缓存问题:\n* 在自回归推理中,每生成一个新token,需存储其Key和Value向量到缓存,以便后续token计算注意力时使用。\n* 序列长度L,则KV缓存大小约 O(L)。\n* 长序列(如100K token)时,KV缓存可能比模型权重还大。\n\n**PagedAttention解决方案**:\n* 将KV缓存也**分页管理**!不再为整个序列连续分配内存,而是将每个token的KV向量分配到固定大小的“页”中。\n* 这些页按需分配:当新token生成,若当前页满,则分配新页。\n* 注意力计算时,可能需访问多个页(分散的KV向量),但系统通过页表知道所有KV向量位置,并能高效组合它们。\n\n**实现细节**:\n* **页大小**:通常一个页存储多个token的KV向量(如16或32 token)。\n* **页分配**:类似OS的内存分配,有空闲页列表,需要时分配。\n* **注意力计算算法修改**:传统注意力计算假设KV缓存是连续内存数组。现在需修改算法以处理“分页的KV缓存.......' 旧model_runner dsv3.2 dp+tp+mtp+ep [2026-01-20 23:39:12,313] [460569] [281472785282432] [tokenizer] [INFO] [io_utils.py-15] : tokenizer start. [2026-01-20 23:39:12,315] [460567] [281472785282432] [tokenizer] [INFO] [io_utils.py-15] : tokenizer start. [2026-01-20 23:39:17.984161] [380115] [380126] [server] [INFO] [infer_tokenizer.cpp:411] [tokenizer] Finished to init tokenizer sub process size 8 [2026-01-20 23:39:17.984191] [380115] [380126] [server] [INFO] [endpoint.cpp:158] [endpoint] mExpertParallel is false, healthchecker init skipped [2026-01-20 23:39:17.992593] [380115] [node-13] [system] [server] [Start mindie server] [success] Daemon start success! [2026-01-20 23:39:17.992604] [380115] [380126] [server] [INFO] [endpoint.cpp:142] [endpoint] Start endpoint success [2026-01-20 23:39:17.992630] [380115] [node-13] [system] [server] [start endpoint] [success] [2026-01-20 23:39:17.992654] [380115] [380126] [server] [INFO] [llm_daemon.cpp:339] [daemon] Daemon start success! curl http://localhost:7070/v1/chat/completions -d '{ "model": "ds_v3.2", "messages": [ {"role": "user", "content": "告诉我大模型推理中的vllm的具体实现细节"} ], "stream": false }' {"id":"endpoint_common_0","object":"chat.completion","created":1768925434,"model":"ds_v3.2","choices":[{"index":0,"message":{"role":"assistant","content":"好的,我来详细解释一下 **vLLM**(Virtual Large Language Model)的具体实现细节。\n\nvLLM 是 NVIDIA 在 2024 年提出的一种 **推理优化技术**,旨在解决大模型推理中的两个核心痛点:**内存瓶颈** 和 **计算效率**。它的本质思想是:**用“虚拟化”的方法,让一个较小的物理GPU模型,去服务一个较大的逻辑用户模型**。\n\n下面我们从 **核心思想、关键技术、实现步骤、优势与局限** 四个方面展开。\n\n---\n\n### 1. 核心思想\n\n传统大模型推理的问题是:\n- **模型太大**(例如 70B参数):需要巨大的GPU内存,单卡甚至多卡都放不下。\n- **即使放得下**,推理过程中,计算单元(SM)利用率低,因为很多时间花在内存访问(IO)上。\n\nvLLM 的虚拟化类比:\n- **就像操作系统中的虚拟内存**:物理RAM只有4GB,但通过分页机制,程序可以认为自己有8GB内存。\n- **就像云计算中的虚拟资源**:物理服务器只有10核,但通过调度,用户可认为自己有100核。\n\nvLLM 的具体类比:\n- **物理模型**:实际存储在GPU内存中的模型参数,可能只有 **20B**(通过精选、压缩)。\n- **逻辑模型**:用户请求时,模型表现出的行为,像是一个 **70B** 的完整模型。\n\n实现这一幻觉的关键是:**只在需要时,动态加载缺失的参数**。\n\n---\n\n### 2. 关键技术\n\nvLLM 依赖三大技术支柱:\n\n#### **2.1 模型分块(Model Chunking)**\n\n将完整大模型按某种策略拆成“块”:\n- **一部分块** → **常驻块**(Resident Chunks):永远留在GPU内存中。\n- **另一部分块** → **虚拟块**(Virtual Chunks):平时存放在慢速存储(CPU内存、NVMe SSD),需要时才加载到GPU。\n\n**分块策略**:\n- 可以是 **按层分块**(例如Transformer的某些层常驻,某些层虚拟)。\n- 也可以是 **按参数类型分块**(例如Attention层的权重常驻,MLP层的权重虚拟)。\n- 策略选择基于:**哪些块对推理延迟影响最大?哪些块使用频率最高?**\n\n#### **2.2 预取与缓取(Prefetching & Caching)**\n\n类似CPU虚拟内存的预取机制:\n- **根据推理序列的预测**,提前将接下来可能需要的虚拟块,加载到GPU。\n- 预测可以基于:\n - **静态分析**:模型结构的知识,知道下一token计算需要哪一层。\n - **动态历史**:从已生成的token序列,推测下一步的访问模式。\n\n**缓存管理**:\n- GPU内存作为虚拟块的缓存,需要替换策略(LRU等)。\n- 目标是最大化 **缓存命中率**,减少实时加载次数。\n\n#### **2.3 计算流水线重组(Compute Pipeline Reorganization)**\n\n调整模型推理的计算步骤顺序,以 **隐藏加载延迟**。\n\n传统顺序:\n1. 需要层X → 2. 加载层X → 3. 计算层X → 4. 需要层Y → ...\n\nvLLM 重组顺序:\n1. 预取层X & 层Y → 2. 计算层Z(常驻) → 3. 同时:层X已就绪,直接计算 → ...\n\n通过 **重叠IO与Compute**,类似计算机体系结构中的“流水线”,让加载时间不成为显性延迟。\n\n---\n\n### 3. 具体实现步骤\n\n我们模拟一个 vLLM 推理一次token的流程:\n\n**步骤0:初始化**\n- 模型分块:定义常驻块集合 R,虚拟块集合 V。\n- 虚拟块存储位置:映射到CPU内存或SSD。\n\n**步骤1:接收请求**\n- 用户输入序列,模型开始推理。\n\n**步骤2:预取预测**\n- 根据当前序列位置,预测接下来1-3步需要哪些虚拟块(V1, V2, V3)。\n- 发起预取指令:将V1, V2, V3从慢存储加载到GPU缓存。\n\n**步骤3:计算常驻块**\n- 在预取进行的同时(IO时间),GPU计算那些常驻块(R)的部分。\n- 这部分计算不依赖虚拟块,所以可并行进行。\n\n**步骤4:计算虚拟块**\n- 当预取完成,虚拟块在GPU就绪,接着计算这些块。\n- 如果预取命中,则无缝衔接;如果未命中(预测错),则实时加载,产生小延迟。\n\n**步骤5:生成token**\n- 整合常驻与虚拟块的计算结果","tool_calls":[]},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":15,"prompt_tokens_details":{"cached_tokens":0},"completion_tokens":1024,"completion_tokens_details":{"reasoning_tokens":0},"total_tokens":1039,"batch_size" ` atb qwen 异步 `[2026-01-21 17:38:02,205] [1639725] [281468181718400] [tokenizer] [INFO] [io_utils.py-15] : tokenizer start. [2026-01-21 17:38:02,205] [1639723] [281468181718400] [tokenizer] [INFO] [io_utils.py-15] : tokenizer start. [2026-01-21 17:38:08.393860] [1636970] [1636981] [server] [INFO] [infer_tokenizer.cpp:411] [tokenizer] Finished to init tokenizer sub process size 8 [2026-01-21 17:38:08.393903] [1636970] [1636981] [server] [INFO] [endpoint.cpp:158] [endpoint] mExpertParallel is false, healthchecker init skipped [2026-01-21 17:38:08.402387] [1636970] [node-13] [system] [server] [Start mindie server] [success] Daemon start success! curl http://localhost:7070/v1/chat/completions \ -d '{ "model": "qwen3", "messages": [ {"role": "user", "content": "告诉我大模型推理中的vllm的具体实现细节"} ], "stream": false }' {"id":"endpoint_common_0","object":"chat.completion","created":1768988738,"model":"qwen3","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n好的,我现在要详细了解一下vLLM的具体实现细节。首先,我之前知道vLLM是一个高效的大语言模型推理框架,但具体它是如何工作的呢?我需要从几个方面来拆解:KV缓存优化、张量并行、PagedAttention机制、量化技术、动态批处理、内存管理以及分布式推理。可能还需要了解它如何与其他框架如Hugging Face Transformers或DeepSpeed比较。\n\n首先,KV缓存优化。KV缓存是Transformer模型中的关键部分,用于存储键和值向量。在传统的实现中,KV缓存可能会占用大量内存,尤其是在处理长序列时。vLLM可能通过某种方式优化了KV缓存的存储和访问,比如使用分页技术,类似于操作系统的内存分页,将KV缓存分割成块,并按需加载到内存中。这样可以减少内存占用,同时保持高效的访问速度。我需要确认这个分页机制是如何工作的,是否使用了硬件加速,比如GPU的内存管理单元。\n\n接下来是张量并行。张量并行是将模型的权重矩阵分割到多个设备上,每个设备处理一部分计算。在vLLM中,张量并行可能被用来扩展模型的规模,使得单个设备无法处理的模型可以通过多个设备并行处理。具体来说,可能是在线性层(如注意力层的Q、K、V投影)中将权重矩阵进行分割,每个设备计算对应的子矩阵,然后通过AllReduce操作聚合结果。需要了解vLLM如何实现张量并行,是否使用了特定的通信库(如NCCL或PyTorch的分布式包),以及如何优化通信开销。\n\n然后是PagedAttention机制。这个听起来像是将注意力计算中的KV缓存分页存储,类似于分页内存管理。传统的注意力机制在处理长序列时,KV缓存会占用大量内存,而PagedAttention可能将KV缓存分成固定大小的块,仅在需要时加载到内存中。这样可以减少内存占用,同时通过预取(prefetching)技术提前加载可能需要的块,减少等待时间。需要了解这种分页机制如何与注意力计算结合,是否使用了硬件特性(如GPU的缓存)来加速访问,以及如何管理分页表。\n\n量化技术方面,vLLM可能采用了模型量化的方法,将模型参数从高精度(如FP32)转换为低精度(如INT8或FP16),从而减少内存占用和计算量。量化可能包括权重量化、激活值量化以及混合精度量化。需要了解vLLM使用了哪种量化方法,是否动态调整精度,以及如何处理量化带来的精度损失(如使用量化感知训练或后训练量化)。\n\n动态批处理(Dynamic Batching)是另一个关键点。动态批处理可以将多个请求合并成一个批次进行处理,从而提高GPU利用率。vLLM可能通过某种调度机制,在运行时动态组合来自不同请求的输入序列,生成更大的批次。需要了解这种批处理策略如何处理不同长度的序列,如何避免长序列阻塞短序列的处理(如使用优先级队列或时间片轮转),以及如何平衡批处理带来的延迟和吞吐量的提升。\n\n内存管理方面,vLLM可能采用了高效的内存分配策略,比如使用内存池或预分配内存块,减少频繁的内存分配和释放带来的开销。此外,可能还使用了异构内存(如GPU和CPU内存协同)来优化数据传输和存储。需要了解vLLM如何管理不同设备之间的内存,是否支持零拷贝或高效的内存映射技术。\n\n分布式推理部分,vLLM可能支持模型并行和数据并行。模型并行将模型的不同层分配到不同的设备上,而数据并行将同一模型的多个副本分配到不同设备上处理不同的数据批次。需要了解vLLM如何实现这两种并行方式,是否支持自动并行策略选择,以及如何优化跨设备的通信和同步。\n\n此外,vLLM可能与其他框架(如Hugging Face Transformers)有接口兼容性,允许用户轻松地将现有模型迁...... ` # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [ ] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [x] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [ ] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!2554 个月前
[新需求] 新增aclgraph独立工具类 Co-authored-by: Dawn952<zhaojunbo13@huawei.com> # message auto-generated for no-merge-commit merge: !160 merge independent_utils_and_files into dev [新需求] 新增aclgraph独立工具类 Created-by: Dawn952 Commit-by: Dawn952 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 补充aclgraph需要的工具文件。\ > 注意:Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fix part of #103 # 修改内容 > 新增了hf.py 用于做huggingface相关校验;新增了url.py 用于屏蔽报错信息中的url信息; 新增了models.__init__ 作为model_runner调用的入口; 新增load_config.py 提供LoadConfig类型; 修改了huggingface_config.py 增加部分参数定义,增加校验。 # 资料变更 > 不涉及。 # 接口变更 > 不涉及。 # 测试结果 > 在aclgraph联调分支完成验证。\ - DeepSeek-V3.2-1201-w8a8 A3 16卡 ``` curl -curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{ "model": "ds_v3.2", "prompt": "What is the best model in China", "stream": false, "ignore_eos": false, "max_tokens": 132 }' http://141.61.105.118:1025/v1/completions {"id":"endpoint_common_1","object":"text_completion","created":1767753398,"model":"ds_v3.2","choices":[{"index":0,"text":"? In Taiwan? In New Zealand? In Canada? In\nJapan? In the United States? In Israel? In Singapore?\n\nSome of the answers to these questions have to be in the form of what the\nbest model of government and governance is in each country.\n\nThe best model is that one which will yield in the country the best\nconditions, the best environment, the best system, the best results, the best\noutputs, the best outcomes.\n\nThe best model is that one which will yield in the country the best\nconditions, the best environment, the best system, the best results, the best\noutputs, the best outcomes for","logprobs":null,"stop_reason":null,"finish_reason":"length"}],"usage":{"prompt_tokens":7,"prompt_tokens_details":{"cached_tokens":0},"completion_tokens":132,"completion_tokens_details":{"reasoning_tokens":0},"total_tokens":139,"batch_size":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"queue_wait_time":[1024,965,627,1176,1169,783,1111,1054,1361,1186,980,765,1205,1774,1215,569,1151,695,706,594,877,1185,626,873,1016,201,575,851,1719,1085,985,1165,989,765,799,384,375,1004,1035,1127,307,816,883,1515,720,820,982,1472,898,1189,640,820,1200,630,2329,443,1010,692,908,1090,1019,1173,518,796,810,935,1498,1197,651,1243,1143,783,771,1108,667,473,1200,1112]}} ``` # CheckList > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]。 - [x] 代码注释完备 - [x] 正确记录错误日志 - [x] 进行了返回值校验 (禁止使用void屏蔽安全函数、自研函数返回值;考虑接口的异常场景;调用底层组件接口时,需要进行返回值校验) - [x] 进行了空指针校验 - [x] 若存在资源申请,使用后资源被正确的释放了 - [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - [x] 按照[代码仓中提供的格式模板](https://gitcode.com/Ascend/MindIE-LLM/blob/master/.clang-format),使用clang-format工具格式化代码 - [ ] 符合Ascend社区的编码规范。[C++ 语言编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-coding-style-guide.md) | [C++ 语言安全编程指导](https://gitcode.com/Ascend/community/blob/master/docs/contributor/Ascend-cpp-secure-coding-guide.md) See merge request: Ascend/MindIE-LLM!1604 个月前