From 4e635cfff7c8ecf40f2d7ec3293843bdeb20a645 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Mon, 23 Jun 2025 16:54:45 +0800 Subject: [PATCH] modify error links and anchors --- .../docs/source_en/images/mindquantum_en.png | Bin 41152 -> 0 bytes .../docs/source_zh_cn/images/mindquantum_cn.png | Bin 36312 -> 0 bytes .../source_en/developer_guide/contributing.md | 2 +- .../deepseek_r1_671b_w8a8_dp4_tp4_ep4.md | 4 ++-- .../developer_guide/contributing.md | 2 +- .../deepseek_r1_671b_w8a8_dp4_tp4_ep4.md | 2 +- .../operation/op_customopbuilder.md | 2 +- .../operation/op_customopbuilder_atb.md | 2 +- .../operation/op_customopbuilder.md | 2 +- .../operation/op_customopbuilder_atb.md | 2 +- 10 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 docs/mindquantum/docs/source_en/images/mindquantum_en.png delete mode 100644 docs/mindquantum/docs/source_zh_cn/images/mindquantum_cn.png diff --git a/docs/mindquantum/docs/source_en/images/mindquantum_en.png b/docs/mindquantum/docs/source_en/images/mindquantum_en.png deleted file mode 100644 index 24663f4e70cd2fb568ea03b04ce3d889722fb806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41152 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 z 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 aY;h?1-f&Bz*BC&6*x8e|CkV$c-TFU~T$*bD diff --git a/docs/vllm_mindspore/docs/source_en/developer_guide/contributing.md b/docs/vllm_mindspore/docs/source_en/developer_guide/contributing.md index bd4e479bd7..59248ddfcd 100644 --- a/docs/vllm_mindspore/docs/source_en/developer_guide/contributing.md +++ b/docs/vllm_mindspore/docs/source_en/developer_guide/contributing.md @@ -18,7 +18,7 @@ To support a new model for vLLM MindSpore code repository, please note the follo - **Follow file format and location specifications.** Model code files should be placed under the `vllm_mindspore/model_executor` directory, organized in corresponding subfolders by model type. - **Implement models using MindSpore interfaces with jit static graph support.** Model definitions in vLLM MindSpore must be implemented using MindSpore interfaces. Since MindSpore's static graph mode offers performance advantages, models should support execution via @jit static graphs. For reference, see the [Qwen2.5](https://gitee.com/mindspore/vllm-mindspore/blob/master/vllm_mindspore/model_executor/models/qwen2.py) implementation. - **Register new models in vLLM MindSpore.** After implementing the model structure, register it in vLLM MindSpore by adding it to `_NATIVE_MODELS` in `vllm_mindspore/model_executor/models/registry.py`. -- **Write unit tests.** New models must include corresponding unit tests. Refer to the [Qwen2.5 testcases](https://gitee.com/mindspore/vllm-mindspore/blob/master/tests/st/python/test_vllm_qwen_7b.py) for examples. +- **Write unit tests.** New models must include corresponding unit tests. Refer to the [Qwen2.5 testcases](https://gitee.com/mindspore/vllm-mindspore/blob/master/tests/st/python/cases_parallel/vllm_qwen_7b.py) for examples. ## Contribution Process diff --git a/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md b/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md index 17257f7638..9a31ef6052 100644 --- a/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md +++ b/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md @@ -1,6 +1,6 @@ # Parallel Inference (DeepSeek R1) -[![View Source](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md) +[![View Source](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/docs/vllm_mindspore/docs/source_en/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md) vLLM MindSpore supports hybrid parallel inference with configurations of tensor parallelism (TP), data parallelism (DP), expert parallelism (EP), and their combinations. For the applicable scenarios of different parallel strategies, refer to the [vLLM official documentation](https://docs.vllm.ai/en/latest/configuration/optimization.html#parallelism-strategies). @@ -284,7 +284,7 @@ Environment variable descriptions: - `MS_ALLOC_CONF`: Set the memory policy. Refer to the [MindSpore documentation](https://www.mindspore.cn/docs/en/master/api_python/env_var_list.html). - `ASCEND_RT_VISIBLE_DEVICES`: Configure the available device IDs for each node. Use the `npu-smi info` command to check. - `vLLM_MODEL_BACKEND`: The backend of the model to run. Currently supported models and backends for vLLM MindSpore can be found in the [Model Support List](../../../user_guide/supported_models/models_list/models_list.md). -- `MINDFORMERS_MODEL_CONFIG`: Model configuration file. Users can find the corresponding YAML file in the [MindSpore Transformers repository](https://gitee.com/mindspore/mindformers/tree/dev/research/deepseek3/deepseek_r1_671b), such as [predict_deepseek_r1_671b_w8a8_ep4t4.yaml](https://gitee.com/mindspore/mindformers/blob/dev/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8_ep4t4.yaml). +- `MINDFORMERS_MODEL_CONFIG`: Model configuration file. Users can find the corresponding YAML file in the [MindSpore Transformers repository](https://gitee.com/mindspore/mindformers/tree/dev/research/deepseek3/deepseek_r1_671b), such as [predict_deepseek_r1_671b_w8a8_ep4t4.yaml](https://gitee.com/mindspore/mindformers/blob/dev/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8_ep4tp4.yaml). The model parallel strategy is specified in the `parallel_config` of the configuration file. For example, the DP4TP4EP4 hybrid parallel configuration is as follows: diff --git a/docs/vllm_mindspore/docs/source_zh_cn/developer_guide/contributing.md b/docs/vllm_mindspore/docs/source_zh_cn/developer_guide/contributing.md index e0a1aaa2c1..f44b6d798e 100644 --- a/docs/vllm_mindspore/docs/source_zh_cn/developer_guide/contributing.md +++ b/docs/vllm_mindspore/docs/source_zh_cn/developer_guide/contributing.md @@ -19,7 +19,7 @@ - **文件格式及位置要遵循规范。** 模型代码文件统一放置于`vllm_mindspore/model_executor`文件夹下,请根据不同模型将代码文件放置于对应的文件夹下。 - **模型基于MindSpore接口实现,支持jit静态图方式执行。** vLLM MindSpore中的模型定义实现需基于MindSpore接口实现。由于MindSpore静态图模式执行性能有优势,因此模型需支持@jit静态图方式执行。详细可参考[Qwen2.5](https://gitee.com/mindspore/vllm-mindspore/blob/master/vllm_mindspore/model_executor/models/qwen2.py)模型定义实现。 - **将新模型在vLLM MindSpore代码中进行注册。** 模型结构定义实现后,需要将该模型注册到vLLM MindSpore中,注册文件位于'vllm_mindspore/model_executor/models/registry.py'中,请将模型注册到`_NATIVE_MODELS`。 -- **编写单元测试。** 新增的模型需同步提交单元测试用例,用例编写请参考[Qwen2.5模型用例](https://gitee.com/mindspore/vllm-mindspore/blob/master/tests/st/python/test_vllm_qwen_7b.py)。 +- **编写单元测试。** 新增的模型需同步提交单元测试用例,用例编写请参考[Qwen2.5模型用例](https://gitee.com/mindspore/vllm-mindspore/blob/master/tests/st/python/cases_parallel/vllm_qwen_7b.py)。 ## 贡献流程 diff --git a/docs/vllm_mindspore/docs/source_zh_cn/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md b/docs/vllm_mindspore/docs/source_zh_cn/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md index add87115e0..02ebe3d1af 100644 --- a/docs/vllm_mindspore/docs/source_zh_cn/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md +++ b/docs/vllm_mindspore/docs/source_zh_cn/getting_started/tutorials/deepseek_parallel/deepseek_r1_671b_w8a8_dp4_tp4_ep4.md @@ -285,7 +285,7 @@ export MINDFORMERS_MODEL_CONFIG=/path/to/research/deepseek3/deepseek_r1_671b/pre - `MS_ALLOC_CONF`: 设置内存策略。可参考[MindSpore官网文档](https://www.mindspore.cn/docs/zh-CN/r2.6.0/api_python/env_var_list.html)。 - `ASCEND_RT_VISIBLE_DEVICES`: 配置每个节点可用device id。用户可使用`npu-smi info`命令进行查询。 - `vLLM_MODEL_BACKEND`:所运行的模型后端。目前vLLM MindSpore所支持的模型与模型后端,可在[模型支持列表](../../../user_guide/supported_models/models_list/models_list.md)中进行查询。 -- `MINDFORMERS_MODEL_CONFIG`:模型配置文件。用户可以在[MindSpore Transformers工程](https://gitee.com/mindspore/mindformers/tree/dev/research/deepseek3/deepseek_r1_671b)中,找到对应模型的yaml文件[predict_deepseek_r1_671b_w8a8.yaml](https://gitee.com/mindspore/mindformers/blob/dev/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8_ep4t4.yaml) 。 +- `MINDFORMERS_MODEL_CONFIG`:模型配置文件。用户可以在[MindSpore Transformers工程](https://gitee.com/mindspore/mindformers/tree/dev/research/deepseek3/deepseek_r1_671b)中,找到对应模型的yaml文件[predict_deepseek_r1_671b_w8a8.yaml](https://gitee.com/mindspore/mindformers/blob/dev/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8_ep4tp4.yaml)。 模型并行策略通过配置文件中的`parallel_config`指定,例如DP4TP4EP4 混合并行配置如下所示: diff --git a/tutorials/source_en/custom_program/operation/op_customopbuilder.md b/tutorials/source_en/custom_program/operation/op_customopbuilder.md index 2f92966c49..8f75e242f5 100644 --- a/tutorials/source_en/custom_program/operation/op_customopbuilder.md +++ b/tutorials/source_en/custom_program/operation/op_customopbuilder.md @@ -27,7 +27,7 @@ As shown in the figure, the operator execution process in MindSpore's dynamic gr ## Custom Operators Support Multi-Stage Pipeline through PyboostRunner -The dynamic graph multi-stage pipeline involves a complex invocation process with many interfaces and data structures. To simplify the integration of custom operators into dynamic graphs, MindSpore encapsulates the [PyboostRunner class](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#class-PyboostRunner). +The dynamic graph multi-stage pipeline involves a complex invocation process with many interfaces and data structures. To simplify the integration of custom operators into dynamic graphs, MindSpore encapsulates the [PyboostRunner class](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#class-pyboostrunner). Below is an example demonstrating the integration process of custom operators into a dynamic graph: diff --git a/tutorials/source_en/custom_program/operation/op_customopbuilder_atb.md b/tutorials/source_en/custom_program/operation/op_customopbuilder_atb.md index ef1b86cd8e..5347fbf93a 100644 --- a/tutorials/source_en/custom_program/operation/op_customopbuilder_atb.md +++ b/tutorials/source_en/custom_program/operation/op_customopbuilder_atb.md @@ -12,7 +12,7 @@ In [Custom Operators Based on CustomOpBuilder](https://www.mindspore.cn/tutorial In the complete [ATB operator workflow](https://www.hiascend.com/document/detail/zh/canncommercial/81RC1/developmentguide/acce/ascendtb/ascendtb_0037.html), users need to execute steps such as constructing `Param`, creating `Operation` and `Context`, setting `variantPack` (operator input-output tensors), calling `Setup`, calling `Execute`, and destroying `Context` and `Operation`. However, for a single operator, its `Operation` only depends on operator attributes (`Param`), and its `Context` only depends on the stream, both of which can be reused. Therefore, MindSpore provides a cache to store these data structures, avoiding unnecessary time consumption caused by repeated creation and destruction. -When integrating ATB operators using the [AtbOpRunner class](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#class-AtbOpRunner), users only need to provide a corresponding hash function for `Param` (used as the key for caching `Operation`) and call the `Init` interface for initialization (constructing `Operation`), followed by the `Run` interface to execute the ATB operator. Additionally, users can directly call the [RunAtbOp](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#function-runatbop) function for one-click execution (the function internally includes calls to both `Init` and `Run` interfaces). +When integrating ATB operators using the [AtbOpRunner class](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#class-atboprunner), users only need to provide a corresponding hash function for `Param` (used as the key for caching `Operation`) and call the `Init` interface for initialization (constructing `Operation`), followed by the `Run` interface to execute the ATB operator. Additionally, users can directly call the [RunAtbOp](https://www.mindspore.cn/tutorials/en/master/custom_program/operation/cpp_api_for_custom_ops.html#function-runatbop) function for one-click execution (the function internally includes calls to both `Init` and `Run` interfaces). This guide uses `SwiGLU` as an example to demonstrate the ATB operator integration process. The complete code can be found in the [code repository](https://gitee.com/mindspore/mindspore/blob/master/tests/st/graph_kernel/custom/jit_test_files/atb_swiglu.cpp). diff --git a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md index 90f3959c19..63c837bc09 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md +++ b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder.md @@ -27,7 +27,7 @@ MindSpore以Python作为前端,用C++实现后端,每个算子执行时需 ## 自定义算子通过PyboostRunner支持多级流水 -动态图多级流水的调用流程较复杂,涉及的接口和数据结构较多,为了方便用户在动态图接入自定义算子,MindSpore封装了[PyboostRunner类](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#class-PyboostRunner)。 +动态图多级流水的调用流程较复杂,涉及的接口和数据结构较多,为了方便用户在动态图接入自定义算子,MindSpore封装了[PyboostRunner类](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#class-pyboostrunner)。 下面以一个例子演示动态图自定义算子的接入流程: diff --git a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md index cc110d200b..a2dfc37f0d 100644 --- a/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md +++ b/tutorials/source_zh_cn/custom_program/operation/op_customopbuilder_atb.md @@ -12,7 +12,7 @@ 在完整的[ATB算子的调用流程](https://www.hiascend.com/document/detail/zh/canncommercial/81RC1/developmentguide/acce/ascendtb/ascendtb_0037.html)中,用户需要执行 构造`Param`、创建`Operation`和`Context`、设置`variantPack`(算子输入输出张量)、调用`Setup`、调用`Execute`、销毁`Context`和`Operation` 等流程。但是对于一个算子来说,其`Operation`仅依赖于算子属性(`Param`),其`Context`仅依赖于流(stream),且都是可以复用的,因此MindSpore提供了一个缓存,将这些数据结构放在缓存中,避免多次创建和销毁带来不必要的时间消耗。 -用户基于 [AtbOpRunner类](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#class-AtbOpRunner) 对接ATB算子时,仅需要提供相应`Param`的哈希函数(作为缓存`Operation`的键值),并调用`Init`接口初始化(即构造`Operation`),再调用`Run`接口即可执行ATB算子。还可以直接调用 [RunAtbOp](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#function-runatbop)函数一键执行(函数内包含了`Init`和`Run`接口的调用)。 +用户基于 [AtbOpRunner类](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#class-atboprunner) 对接ATB算子时,仅需要提供相应`Param`的哈希函数(作为缓存`Operation`的键值),并调用`Init`接口初始化(即构造`Operation`),再调用`Run`接口即可执行ATB算子。还可以直接调用 [RunAtbOp](https://www.mindspore.cn/tutorials/zh-CN/master/custom_program/operation/cpp_api_for_custom_ops.html#function-runatbop)函数一键执行(函数内包含了`Init`和`Run`接口的调用)。 本指南以一个`SwiGLU`为例,展示ATB算子的接入流程。完整代码请参阅[代码仓库](https://gitee.com/mindspore/mindspore/blob/master/tests/st/graph_kernel/custom/jit_test_files/atb_swiglu.cpp)。 -- Gitee