| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[BugFix]: 解决快恢stop_device接口不抛出FORCE STOP Co-authored-by: jiangkaiqiang<jiangkaiqiang@huawei.com> # message auto-generated for no-merge-commit merge: !1082 merge dev_hbm into dev [BugFix]: 解决快恢stop_device接口不抛出FORCE STOP Created-by: jiangkaiqiang Commit-by: jiangkaiqiang Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes [#660](https://gitcode.com/Ascend/MindIE-LLM/issues/660) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 1. 增加synchronize使得forcestop能够抛出 2. 快恢时销毁ATTN_DP的cpu的通信域,使得请求不会卡在cpu通信算子 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 不涉及 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 不涉及 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。  # 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!1082 | 1 个月前 | |
[RFC]: 刷新代码格式——mindie_llm Co-authored-by: KaiMa<KaiMa_SDU@outlook.com> # message auto-generated for no-merge-commit merge: !905 merge pre_commit_llm into dev [RFC]: 刷新代码格式——mindie_llm Created-by: KaiMa Commit-by: KaiMa Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes #[443](https://gitcode.com/Ascend/MindIE-LLM/issues/443) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 # 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!905 | 3 个月前 | |
[RFC]: 刷新代码格式——mindie_llm Co-authored-by: KaiMa<KaiMa_SDU@outlook.com> # message auto-generated for no-merge-commit merge: !905 merge pre_commit_llm into dev [RFC]: 刷新代码格式——mindie_llm Created-by: KaiMa Commit-by: KaiMa Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes #[443](https://gitcode.com/Ascend/MindIE-LLM/issues/443) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 # 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!905 | 3 个月前 | |
修复dsv32双机混布开启splitfuse+异步调度挂死问题 Co-authored-by: shenzhao<shenzhao9@huawei.com> # message auto-generated for no-merge-commit merge: !1114 merge 0707 into dev 修复dsv32双机混布开启splitfuse+异步调度挂死问题 Created-by: shenzhao Commit-by: shenzhao Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. fix part of [#674](https://gitcode.com/Ascend/MindIE-LLM/issues/674) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # Add SplitFuse Async D2H Event Dependency 修改说明 ## 背景 SplitFuse async 推理路径中,原流程存在如下 overlap: text 主线程:Bn sampling_output _to_host forward 线程:Bn+1 _fill_in_model_result_exp / forward 历史挂测表明,Bn _to_host 与 Bn+1 fill/forward overlap 时可能触发脏数据或挂死。 ## 新增核心结构 ### _AsyncToHostHandle _AsyncToHostHandle 用于保存一次异步 D2H 的状态。 主要字段: python host_instance tensor_fields event _finalized 字段含义: - host_instance:host 侧浅拷贝对象。 - tensor_fields:需要从 host tensor 转 numpy 的字段列表。 - event:copy stream 上记录的 copy_done_event。 - _finalized:防止重复 finalize。 核心方法: python def finalize(self): if not self._finalized: if self.event is not None: self.event.synchronize() for field_name, host_tensor, source_dtype in self.tensor_fields: if source_dtype == torch.bfloat16: host_array = host_tensor.float().numpy() else: host_array = host_tensor.numpy() setattr(self.host_instance, field_name, host_array) self._finalized = True return self.host_instance finalize() 保证 postprocess 之前 D2H 已完成,因此不会把未完成的 host buffer 传给 postprocess。 ## 新增接口 ### _empty_host_like(tensor) 创建与 NPU tensor 同 shape / dtype 的 CPU host buffer。 ` ### _get_to_host_stream() 懒创建专用 D2H copy stream: python self.to_host_stream = torch.npu.Stream(device=torch.npu.current_device()) 该 stream 专门用于 sampling_output 的 NPU to host copy,避免把 D2H 插入主 execution stream。 ### _to_host_async(data_instance, execution_done=None) 核心异步 D2H 接口。 主要流程: text 1. 获取 copy_stream。 2. 创建 host_instance。 3. 创建 copy_done_event。 4. copy_stream 等 Bn execution_done。 5. 遍历 SamplingOutput 字段。 6. 对 NPU tensor 分配 host tensor。 7. 执行 non_blocking D2H copy。 8. 在 copy_stream 上 record copy_done_event。 9. 返回 _AsyncToHostHandle。 关键代码逻辑: python with torch.npu.stream(copy_stream): if execution_done is not None: copy_stream.wait_event(execution_done) for field in fields(data_instance): field_value = getattr(data_instance, field.name) if isinstance(field_value, torch.Tensor): if getattr(field_value, "is_npu", False): host_tensor = self._empty_host_like(field_value) field_value.record_stream(copy_stream) host_tensor.copy_(field_value, non_blocking=True) tensor_fields.append((field.name, host_tensor, field_value.dtype)) setattr(host_instance, field.name, host_tensor) ### _wait_async_to_host_event(async_to_host_handle) 在当前 NPU stream 上等待 D2H copy 完成。 ## generate_token_async 流程修改 原逻辑中,主线程在 input_queue.put() 后同步 _to_host(): text input_queue.put(Bn+1) execution_done.synchronize() _to_host(Bn sampling_output) postprocess(Bn) 修改后,在 input_queue.put() 前提前启动异步 D2H: python async_to_host_handle = None if ENV.model_runner_exp and model_output_wrapper.sampling_output is not None: async_to_host_handle = self._to_host_async( model_output_wrapper.sampling_output, execution_done=model_output_wrapper.execution_done, ) model_input_wrapper.previous_to_host_handle = async_to_host_handle postprocess 前: python if async_to_host_handle is not None: sampling_output = async_to_host_handle.finalize() else: model_output_wrapper.execution_done.synchronize() sampling_output = self._to_host(model_output_wrapper.sampling_output) ## forward_loop 流程修改 在 _fill_in_model_result_exp() 前等待上一批 D2H 完成: python if ENV.model_runner_exp: if model_output_wrapper is not None: self._wait_async_to_host_event( getattr(model_input_wrapper, "previous_to_host_handle", None) ) self._fill_in_model_result_exp(model_input_wrapper, model_output_wrapper) 这保证: text Bn sampling_output D2H copy 完成 ↓ Bn+1 _fill_in_model_result_exp / forward ## 修改后的时序 text execution stream: Bn forward/sample record execution_done Bn+1 wait copy_done_event Bn+1 fill_in_model_result_exp Bn+1 forward copy stream: wait execution_done Bn sampling_output D2H copy record copy_done_event CPU: 启动 async D2H input_queue.put(Bn+1) postprocess 前 finalize ` # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 1. 挂测测试:在原场景下,挂测12小时未挂死 2. 性能测试: dsv32, A3双机 32K上下文,开启异步+mtp2 1)16K输入 1K输出  2)2K输入 2K输出  3. 精度测试(A3双机混布,64K上下文,开启splitfuse): aisbench 16并发,基线精度77  # 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!1114 | 23 天前 | |
[RFC]: 刷新代码格式——mindie_llm Co-authored-by: KaiMa<KaiMa_SDU@outlook.com> # message auto-generated for no-merge-commit merge: !905 merge pre_commit_llm into dev [RFC]: 刷新代码格式——mindie_llm Created-by: KaiMa Commit-by: KaiMa Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes #[443](https://gitcode.com/Ascend/MindIE-LLM/issues/443) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 # 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!905 | 3 个月前 | |
[RFC]: 刷新代码格式——mindie_llm Co-authored-by: KaiMa<KaiMa_SDU@outlook.com> # message auto-generated for no-merge-commit merge: !905 merge pre_commit_llm into dev [RFC]: 刷新代码格式——mindie_llm Created-by: KaiMa Commit-by: KaiMa Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes #[443](https://gitcode.com/Ascend/MindIE-LLM/issues/443) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 # 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!905 | 3 个月前 | |
[dev]Synchronize code Co-authored-by: forcekeng<gengli8@huawei.com> | 7 个月前 | |
[fix]splitfuse+prefixcache+dp>1无法叠加仅在PD混部下生效 Co-authored-by: lijiaqi139<lijiaqi139@huawei.com> # message auto-generated for no-merge-commit merge: !1118 merge fix_splitfuse_prefixcache_dp into dev [fix]splitfuse+prefixcache+dp>1无法叠加仅在PD混部下生效 Created-by: lijiaqi139 Commit-by: lijiaqi139 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20251225 --> # 合入背景 > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. Fixes [#679](https://gitcode.com/Ascend/MindIE-LLM/issues/679) # 修改内容 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)。 # 资料变更 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”。 # 接口变更 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”。 # 测试结果 > 请说明测试场景,测试方法以及测试结果。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 # 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!1118 | 21 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 23 天前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 7 个月前 | ||
| 21 天前 |