From bcc94aab03265a285d497c235cfe2523ad86a0e9 Mon Sep 17 00:00:00 2001 From: huan <3174348550@qq.com> Date: Tue, 8 Jul 2025 10:54:45 +0800 Subject: [PATCH] update en files --- .../accuracy_comparison.md | 422 ++++++++++++++++++ .../source_en/example/distilled/distilled.md | 322 +++++++++++++ .../distilled/images/distilled_process.png | Bin 0 -> 136051 bytes docs/mindformers/docs/source_en/index.rst | 13 + .../example/distilled/distilled.md | 6 +- 5 files changed, 760 insertions(+), 3 deletions(-) create mode 100644 docs/mindformers/docs/source_en/advanced_development/accuracy_comparison.md create mode 100644 docs/mindformers/docs/source_en/example/distilled/distilled.md create mode 100644 docs/mindformers/docs/source_en/example/distilled/images/distilled_process.png diff --git a/docs/mindformers/docs/source_en/advanced_development/accuracy_comparison.md b/docs/mindformers/docs/source_en/advanced_development/accuracy_comparison.md new file mode 100644 index 0000000000..9a90965154 --- /dev/null +++ b/docs/mindformers/docs/source_en/advanced_development/accuracy_comparison.md @@ -0,0 +1,422 @@ +# Comparing the Model Precision with that of Megatron-LM + +[![View Source On Gitee](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/mindformers/docs/source_en/advanced_development/accuracy_comparison.md) + +## 1. Overview + +In the LLM training system, precision validation at the model level is a key step to ensure training stability and result reliability. As training tasks become increasingly complex and model structures become larger, it is particularly important to ensure alignment of the overall model behavior between different implementations. + +Megatron-LM is a mature framework for large-scale training tasks. It is highly modular and scalable and is widely used in training scenarios with high performance requirements. MindSpore Transformers r1.6.0 upgrades the model architecture by using the ModuleSpec configuration mode to build models. This makes model structure definition **more flexible** and **easier to reuse**, greatly improving development efficiency. In addition, comprehensive training support is provided in the NPU environment, fully leveraging the advantages of the NPU architecture. + +This document focuses on the validation of precision consistency at the model level. By building equivalent model structures and configurations and using unified inputs, this document compares key training performance indicators such as the forward output, loss, gradient behavior to validate the reliability and precision controllability of MindSpore Transformers in the NPU environment. + +## 2. Environment + +This section describes the recommended basic operating environment for the precision comparison experiment. + +### Driver version + +| GPU | Version | NPU | Version | +|------|------|------|---------| +| CUDA | 12.1 | CANN | 8.1.RC1 | + +### Important libraries and dependency versions + +| GPU | Version | NPU | Version | +|--------------------|--------------|------------------------|---------| +| Megatron-LM | core_r0.12.0 | MindSpore Transformers | dev | +| Python | 3.10 or later | Python | 3.10 or later| +| PyTorch | 2.7.0 | MindSpore | 2.6.0 | +| NumPy | 1.26.4 | NumPy | 1.26.4 | +| Transformer Engine | 2.1.0 | | | +| Apex | 0.1 | | | + +### Image links + +The **GPU/NPU** dependency versions in the preceding tables are for reference only. The actual versions in official images prevail. + +- **Megatron-LM**: For details, see [Megatron-LM documentation](https://github.com/NVIDIA/Megatron-LM/tree/core_r0.12.0?tab=readme-ov-file#setup). + +- **MindSpore Transformers**: For details, see [MindSpore Transformers documentation](https://gitee.com/mindspore/mindformers/blob/dev/README.md). + +## 3. Precision Comparison Process + +This section describes the model-level precision consistency validation process between MindSpore Transformers and the mainstream Megatron-LM in an NPU environment. This process is used to guide users through the entire alignment from model configuration, data input, and forward output, to gradient backpropagation, and finally evaluate the precision consistency of the two frameworks under the same task. + +### 3.1 Configuration Alignment + +The first step of the precision comparison process is to ensure that the two frameworks use **the same model configuration**. This section provides the configuration files of [Megatron-LM](https://gitee.com/mindspore/docs/blob/master/docs/mindformers/docs/source_zh_cn/example/accuracy_comparison/example.sh) and [MindSpore Transformers], which define the model structure, parallel policy, and key training hyperparameters. + +The configuration alignment aims to ensure that the two systems are as consistent as possible in the initial state, so that the forward output and gradient backpropagation can be compared. + +The following tables describe the configuration comparison with Megatron-LM. + +- Model configurations + + This document supports only the precision comparison of the mcore model. Therefore, `use-mcore-model` must be configured for Megatron-LM, and `use_legacy: False` must be configured for MindSpore Transformers. + + | Megatron-LM | Description | MindSpore Transformers | Description | + |--------------------------------------------|---------------------------------------------|--------------------------------------------|---------------------------------------------------------------------| + | `use-legacy-model` and `use-mcore-model` | Specifies whether to use the mcore model. | `use_legacy` | Specifies whether to use the mcore model. | + | `num-layers` | Number of network layers, that is, number of transformer layers. | `num_layers` | Number of network layers, that is, number of transformer layers. | + | `encoder-num-layers` | Number of encoder layers. | Not supported. | | + | `decoder-num-layers` | Number of decoder layers. | Not supported. | | + | `hidden-size` | Size of the hidden layer, which is the dimension in the hidden state. | `hidden_size` | Size of the hidden layer, which is the dimension in the hidden state. | + | `ffn-hidden-size` | Size of the hidden layer in the feedforward network. | `intermediate_size` | Size of the hidden layer in the feedforward network. | + | `num-attention-heads` | Number of attention heads. | `num_heads` | Number of attention heads. | + | `kv-channels` | Number of key/value tensor channels. | `head_dim` | Number of key/value tensor channels. | + | `group-query-attention` | Specifies whether to enable group query attention. | `use_gqa` | Specifies whether to enable group query attention. | + | `num-query-groups` | Number of query groups. | `n_kv_heads` | Number of query groups. | + | `max-position-embeddings` | Maximum position encoding length. | `max_position_embeddings` | Maximum position encoding length. | + | `position-embedding-type` | Position encoding type, such as **learned_absolute** and **rope**. | `position_embedding_type` | Position encoding type, such as **learned_absolute** and **rope**. | + | `use-rotary-position-embeddings` | Specifies whether to use rotary position embedding (RoPE). | Specified by `position_embedding_type`==`rope` | Specifies whether to use RoPE. | + | `rotary-base` | Rotary base used for RoPE. | `rotary_base` | Rotary base used for RoPE. | + | `rotary-percent` | RoPE usage ratio. | `rotary_percent` | RoPE usage ratio. | + | `rotary-interleaved` | Specifies whether to use interleaved RoPE. | `rotary_interleaved` | Specifies whether to use interleaved RoPE. | + | `rotary-seq-len-interpolation-factor` | Rotary sequence length interpolation factor. | `rotary_seq_len_interpolation_factor` | Rotary sequence length interpolation factor. | + | `use-rope-scaling` | Specifies whether to enable RoPE scaling. | `use_rope_scaling` | Specifies whether to enable RoPE scaling. | + | `rope-scaling-factor` | RoPE scaling factor. | `scaling_factor` | RoPE scaling factor. | + | `no-position-embedding` | Specifies whether to disable location encoding. | `no-position-embedding` | Specifies whether to disable location encoding. | + | `disable-bias-linear` | Disables bias in linear layers. | `add_bias_linear` | Enables bias in linear layers. | + | `mrope-section` | Information of multiple RoPE sections. | Not supported. | | + | `make-vocab-size-divisible-by` | Divides the size of the word table by a specified number. | Not supported. | By default, the dictionary size is not changed. | + | `init-method-std` | Standard deviation of the normal distribution used during model parameter initialization. | `init_method_std` | Standard deviation of the normal distribution used during model parameter initialization. | + | `attention-dropout` | Dropout probability applied in the multi-head self-attention mechanism. | `attention_dropout` | Dropout probability applied in the multi-head self-attention mechanism. | + | `hidden-dropout` | Dropout probability in the hidden layer. | `hidden_dropout` | Dropout probability in the hidden layer. | + | `normalization` | Normalization method, which can be **LayerNorm** or **RMSNorm**. | `normalization` | Normalization method, which can be **LayerNorm** or **RMSNorm**. | + | `norm-epsilon` | Normalized stability factor (epsilon). | `rms_norm_eps` | RMSNorm stability factor. | + | `apply-layernorm-1p` | Specifies whether to add 1 after **LayerNorm**. | Not supported. | | + | `apply-residual-connection-post-layernorm` | Specifies whether the residual connection is applied after LayerNorm. | `apply_residual_connection_post_layernorm` | Specifies whether the residual connection is applied after LayerNorm. | + | `openai-gelu` | Specifies whether to use the GELU activation function of the OpenAI version. | Not supported. | | + | `squared-relu` | Specifies whether to use the square ReLU activation function. | Not supported. | | + | Specified by `swiglu`, `openai-gelu`, and `squared-relu` | The default value is **torch.nn.functional.gelu**. | `hidden_act` | Activation function type. | + | `gated_linear_unit` | Specifies whether to use gate linear unit in multi-layer perceptron (MLP). | `gated_linear_unit` | Specifies whether to use gate linear unit in MLP. | + | `swiglu` | Specifies whether to use the SwiGLU activation function. | `hidden_act`==`silu` and `gated_linear_unit`| Specifies whether to use the SwiGLU activation function. | + | `no-persist-layer-norm` | Disables persistence layer normalization. | Not supported. | | + | `untie-embeddings-and-output-weights` | Specifies whether to decouple the weights of the input embedding layer and output layer. | `untie_embeddings_and_output_weights` | Specifies whether to decouple the weights of the input embedding layer and output layer. | + | Specified by `fp16` and `bf16` | Tensor compute precision during training. | `compute_dtype` | Tensor compute precision during training. | + | `grad-reduce-in-bf16` | Gradient reduction using BFloat16. | Not supported. | | + | Not supported. | By default, the initialization tensor is generated in BFloat16 format. | `param_init_type` | Initial precision of the weight tensor. The default value is **Float32**, which ensures that the backward gradient is updated in Float32. | + | Not supported. | By default, layer normalization is calculated in Float32. | `layernorm_compute_type` | Layer normalization tensor calculation precision. | + | `attention-softmax-in-fp32` | Executes **attention softmax** in Float32. | `softmax_compute_type` | Softmax tensor calculation precision. | + | Not supported. | | `rotary_dtype` | Position encoding tensor calculation precision. | + | `loss-scale` | Overall loss scaling factor. | `loss_scale_value` | Overall loss scaling factor, which is configured in **runner_wrapper**. If `compute_dtype` is set to **BFloat16**, the value is usually set to **1.0**.| + | `initial-loss-scale` | Initial loss scaling factor. | Not supported. | | + | `min-loss-scale` | Minimum loss scaling factor. | Not supported. | | + | `loss-scale-window` | Dynamic window size scaling. | `loss_scale_window` | Dynamic window size scaling. | + | `hysteresis` | Loss scale hysteresis parameter. | Not supported. | | + | `fp32-residual-connection` | Uses Float32 for residual connection. | Not supported. | | + | `accumulate-allreduce-grads-in-fp32` | Accumulates and reduces gradients using Float32. | Not supported. | Accumulates and reduces gradients using Float32 by default. | + | `fp16-lm-cross-entropy` | Uses Float16 to execute the cross entropy of the LLM. | Not supported. | Uses Float32 to execute the cross entropy of the LLM by default. | + | `q-lora-rank` | LoRA rank of the query projection layer, which is used when Q-LoRA is enabled. | `q_lora_rank` | LoRA rank of the query projection layer, which is used when Q-LoRA is enabled. | + | `kv-lora-rank` | LoRA rank of the key/value projection layer, which is used when KV-LoRA is enabled. | `kv_lora_rank` | LoRA rank of the key/value projection layer, which is used when KV-LoRA is enabled. | + | `qk-head-dim` | Number of dimensions per Q/K head. | `qk_nope_head_dim` | Number of dimensions per Q/K head. | + | `qk-pos-emb-head-dim` | Number of relative position embedding dimensions per Q/K head. | `qk_rope_head_dim` | Number of relative position embedding dimensions per Q/K head. | + | `v-head-dim` | Number of dimensions per value projection (V head). | `v_head_dim` | Number of dimensions per value projection (V head). | + | `rotary-scaling-factor` | RoPE scaling coefficient.| `scaling_factor` | RoPE scaling coefficient. | + | `use-precision-aware-optimizer` | Enables the optimizer with precision awareness to automatically manage parameter updates of different data types. | Not supported. | | + | `main-grads-dtype` | Data type of the main gradient. | Not supported. | By default, Float32 is used as the data type of the main gradient. | + | `main-params-dtype` | Data type of the main parameter. | Not supported. | By default, Float32 is used as the data type of the main parameter. | + | `exp-avg-dtype` | Data type of the exponential moving average (EMA). | Not supported. | | + | `exp-avg-sq-dtype` | Data type of the EMA square item. | Not supported. | | + | `first-last-layers-bf16` | Specifies whether to forcibly use BFloat16 at the first and last layers. | Not supported. | | + | `num-layers-at-start-in-bf16` | Number of layers that start with BFloat16. | Not supported. | | + | `num-layers-at-end-in-bf16` | Number of layers that end with BFloat16. | Not supported. | | + | `multi-latent-attention` | Specifies whether to enable the multi-hidden variable attention mechanism. | `multi_latent_attention` | Specifies whether to enable the multi-hidden variable attention mechanism. | + | `qk-layernorm` | Enables query/key layer normalization. | `qk-layernorm` | Enables query/key layer normalization. | + +- Optimizer and learning rate scheduling configurations + + | Megatron-LM | Description | MindSpore Transformers | Description | + |---------------------------|-----------------------------------|------------------------|------------------------------------| + | `optimizer` | Optimizer type, such as Adam and SGD. | `type` | Optimizer type, such as Adam and SGD. | + | `adam-beta1` and `adam-beta2`| β parameter of the Adam optimizer. | `betas` | β parameter of the Adam optimizer. | + | `adam-eps` | ε in the Adam optimizer (to prevent division by zero). | `eps` | ε in the Adam optimizer (to prevent division by zero). | + | `weight-decay` | Weight decay coefficient. | `weight-decay` | Weight decay coefficient. | + | `start-weight-decay` | Initial weight decay. | Not supported. | | + | `end-weight-decay` | Final weight decay. | Not supported. | | + | `weight-decay-incr-style` | Weight decay adjustment policy, which can be **constant**, **linear**, and **cosine**.| Not supported. | | + | `clip-grad` | Gradient clipping threshold. | `clip_grad` | Gradient clipping threshold, which is configured in **runner_wrapper**. The value is usually **1.0**.| + | `lr` | Learning rate. | `learning_rate` | Learning rate. | + | `lr-decay-style` | Learning rate decay mode. | `type` | Learning rate decay mode. | + | `lr-decay-iters` | Number of iterations corresponding to the learning rate decay. | `total_steps` | Total number of iterations by default. | + | `lr-decay-samples` | Number of samples corresponding to the learning rate decay. | Not supported. | | + | `lr-warmup-iters` | Number of warm-up iteration steps of the learning rate. | `warmup_steps` | Number of warm-up iteration steps of the learning rate. | + | `lr-warmup-fraction` | Proportion of the learning rate warm-up phase. | `warmup_ratio` | Proportion of the learning rate warm-up phase. | + | `lr-warmup-init` | Initial learning rate for warm-up. | `warmup_lr_init` | Initial learning rate for warm-up. | + | `min-lr` | Minimum learning rate. | `min-lr` | Minimum learning rate. | + +- Parallel and distributed configurations + + | Megatron-LM | Description | MindSpore Transformers | Description | + |----------------------------------------|--------------------------------------------|-------------------------------------|---------------------------| + | `tensor-model-parallel-size` | Degree of tensor model parallelism. | `model_parallel` | Degree of tensor model parallelism. | + | `pipeline-model-parallel-size` | Parallel size of the pipeline model. | `pipeline_stage` | Parallel size of the pipeline model. | + | `sequence-parallel` | Specifies whether to enable sequence parallelism. | `use_seq_parallel` | Specifies whether to enable sequence parallelism. | + | `context-parallel-size` | Context parallel size. | `context_parallel` | Context parallel size. | + | `use-distributed-optimizer` | Specifies whether to use a distributed optimizer. | `parallel_optimizer_config` | Specifies whether to use a distributed optimizer. | + | `expert-model-parallel-size` | Degree of model parallelism at the expert layer. | `expert_parallel` | Degree of model parallelism at the expert layer. | + | `expert-tensor-parallel-size` | Degree of tensor parallelism at the expert layer. | `expert_model_parallel` | Degree of tensor parallelism at the expert layer. | + +- FlashAttention/Fused Attention + + | Megatron-LM | Description | MindSpore Transformers | Description | + |-----------------------------|----------------------------------------|------------------------|--------------------------| + | `attention-backend` | Attention implementation backend, which can be **flash**, **fused**, **unfused**, **local**, and **auto**.| Not supported. | | + | `use-flash-attn` | Specifies whether to enable FlashAttention. | `use_flash_attention` | Specifies whether to enable FlashAttention. FlashAttention is enabled by default.| + | `no-masked-softmax-fusion` | Disables masked softmax fusion. | Not supported. | | + | `no-bias-gelu-fusion` | Disables bias+GELU fusion. | Not supported. | | + | `no-bias-swiglu-fusion` | Disables bias+SwiGLU fusion. | Not supported. | | + | `no-bias-dropout-fusion` | Disables bias+Dropout fusion. | Not supported. | | + | `no-rope-fusion` | Disables RoPE fusion. | Not supported. | | + | `cross-entropy-loss-fusion` | Enables cross entropy loss fusion. | Not supported. | | + +- MoE + + | Megatron-LM | Description | MindSpore Transformers | Description | + |---------------------------------------|----------------------------|---------------------------------------|----------------------------| + | `num-experts` | Number of experts at each layer. | `num-experts` | Number of experts at each layer. | + | `moe-layer-freq` | Number of layers between inserted MoE layers. | `moe-layer-freq` | Number of layers between inserted MoE layers. | + | `moe-ffn-hidden-size` | Number of dimensions in the hidden FFN layer in MoE. | `moe_intermediate_size` | Number of dimensions in the hidden FFN layer in MoE. | + | `moe-shared-expert-intermediate-size` | Number of middle dimensions shared by experts. | `moe_shared_expert_intermediate_size` | Number of middle dimensions shared by experts. | + | `moe-shared-expert-overlap` | Specifies whether to overlap the middle layer shared by experts. | `moe_shared_expert_overlap` | Specifies whether to overlap the middle layer shared by experts. | + | `moe-grouped-gemm` | Specifies whether to use the grouped GEMM optimization. | `use_gmm` | Specifies whether to use the grouped GEMM optimization. | + | `moe-router-load-balancing-type` | Router load balancing policy. | `moe_router_load_balancing_type` | Router load balancing policy. | + | `moe-router-dtype` | Router score data type. | `router_dense_type` | Router score data type. | + | `moe-router-score-function` | Router score calculation method (for example, **softmax**). | `use_gating_sigmoid` | Specifies whether to use the Sigmoid activation function. | + | `moe-router-topk` | Number of top-*k* selected routers. | `num_experts_chosen` | Number of top-*k* selected routers. | + | `moe-router-pre-softmax` | Specifies whether to preprocess before softmax. | `moe_router_pre_softmax` | Specifies whether to preprocess before softmax. | + | `moe-router-num-groups` | Number of token groups. | `n_groups` | Number of token groups. | + | `moe-router-group-topk` | Number of top-*k* tokens in each group. | `topk_group` | Number of top-*k* tokens in each group. | + | `moe-router-topk-scaling-factor` | Top-*k* score scaling factor. | `routed_scaling_factor` | Top-*k* score scaling factor. | + | `moe-router-enable-expert-bias` | Specifies whether to use the bias of an expert. | `balance_via_topk_bias` | Specifies whether to use the bias of an expert. | + | `moe-router-bias-update-rate` | Update rate of expert bias. | `topk_bias_update_rate` | Update rate of expert bias. | + | `moe-use-legacy-grouped-gemm` | Specifies whether to use the source version of Grouped GEMM. | Not supported. | | + | `moe-aux-loss-coeff` | Auxiliary loss coefficient of MoE. | Not supported. | | + | `moe-z-loss-coeff` | MoE z-loss coefficient. | Not supported. | | + | `moe-input-jitter-eps` | Input jitter noise of MoE. | `moe_input_jitter_eps` | Input jitter noise of MoE. | + | `moe-token-dispatcher-type` | Token scheduling policy (for example, **allgather**). | Not supported. | | + | `moe-enable-deepep` | Specifies whether to enable DeepEP hybrid expert optimization. | `moe_enable_deepep` | Specifies whether to enable DeepEP hybrid expert optimization. | + | `moe-per-layer-logging` | Prints logs at each MoE layer. | `moe_per_layer_logging` | Prints logs at each MoE layer. | + | `moe-expert-capacity-factor` | Expansion ratio of the expert capacity. | `capacity_factor` | Expansion ratio of the expert capacity. | + | `moe-pad-expert-input-to-capacity` | Specifies whether to fill the expert input to the capacity upper limit. | `moe_pad_expert_input_to_capacity` | Specifies whether to fill the expert input to the capacity upper limit. | + | `moe-token-drop-policy` | Token discarding policy (for example, **probs** or **position**).| `enable_sdrop` | Token discarding policy (for example, **probs** or **position**).| + | `moe-extended-tp` | Enables extended tensor parallelism. | Not supported. | | + | `moe-use-upcycling` | Specifies whether to enable expert upcycling. | Not supported. | | + | `moe-permute-fusion` | Enables internal permute fusion optimization of experts. | `moe_permute_fusion` | Enables internal permute fusion optimization of experts. | + | `mtp-num-layers` | Number of MoE layers. | `mtp_depth` | Number of MoE layers. | + | `mtp-loss-scaling-factor` | Loss scaling in the MoE architecture. | `mtp_loss_factor` | Loss scaling in the MoE architecture. | + +- Data loading and tokenization + + | Megatron-LM | Description | MindSpore Transformers | Description | + |-------------------------------|---------------------------|------------------------|--------------------------------| + | `data-path` and `split` | General data path. | `data_path` | Sampling ratio and path of the Megatron dataset. | + | `train-data-path` | Training data path. | Not supported. | | + | `valid-data-path` | Validation data path. | Not supported. | | + | `test-data-path` | Test data path. | Not supported. | | + | `vocab-size` | Vocabulary size. | `vocab_size` | Vocabulary size. | + | `vocab-file` | Vocabulary file path. | Not supported. | | + | `merge-file` | BPE combination rule file. | Not supported. | | + | `tokenizer-type` | Tokenizer type (for example, **GPT2BPETokenizer**).| Not supported. | The tokenizer corresponding to Huggingface is used by default.| + | `seq-length` | Input sequence length. | `seq_length` | Input sequence length. | + | `encoder-seq-length` | Encoder input length. | Not supported. | | + | `decoder-seq-length` | Decoder input length. | Not supported. | | + | `retriever-seq-length` | Retriever sequence length (if enabled). | Not supported. | | + | `num-workers` | Number of threads for loading data. | `num_parallel_workers` | Number of threads for loading data. | + | `num-dataset-builder-threads` | Number of threads for building datasets. | Not supported. | | + | `data-cache-path` | Data cache path. | Not supported. | | + +- Training control and save + + | Megatron-LM | Description | MindSpore Transformers | Description | + |--------------------------------|------------------------|----------------------------------------|-----------------------------------------------------------------------------| + | Not supported. | Total number of local samples processed in each iteration. | `batch_size` | Total number of local samples processed in each iteration, which is configured in `runner_wrapper`. | + | Not supported. | Total number of local samples processed in each iteration. | `micro_batch_interleave_num` | Number of micro-batch interleaving. When `micro_batch_interleave_num` is greater than 1, multiple copies are enabled for parallel processing. | + | `global_batch_size` | Total number of global samples processed in each iteration. | `batch_size` and `data_parallel` | Total number of global samples processed in each iteration, which is the value of `batch_size` multiplied by the value of `data_parallel` multiplied by the value of `micro_batch_interleave_num`.| + | Not supported. | Number of iteration periods. | `epochs` | Number of iteration periods, which is configured in `runner_wrapper`. | + | `train-samples` | Total number of training samples. | `sizes` | Total number of training samples, which is configured in `train_dataset`. | + | `train-iters` | Total number of training iterations. | `epochs`, `sizes`, and `global_batch_size`| Total number of training iterations, which is the value of `sizes` divided by the value of `global_batch_size` and multiplied by the value of `epochs`. | + | `log-interval` | Log recording interval (number of iteration steps). | `per_print_times` | Log recording interval (number of iteration steps), which is configured in `MFLossMonitor` of `callbacks`. | + | `eval-iters` | Number of iterations used in each evaluation. | Not supported. | | + | `eval-interval` | Number of evaluation interval steps. | Not supported. | | + | `save` | Model save path. | `output_dir` | Model save path. | + | `save-interval` | Model save interval (number of iteration steps). | `save_checkpoint_steps` | Model save interval (number of iteration steps), which is configured in `CheckpointMonitor` of `callbacks`. | + | `non-persistent-save-interval` | (Non-persistent) temporary storage interval. | Not supported. | | + | `non-persistent-ckpt-type` | Temporary storage type (for example, **global** or **local**).| Not supported. | | + | `pretrained-checkpoint` | Pretrained model path. | Not supported. | | + | `ckpt-step` | Loads the weight of a specified step. | `load_checkpoint` and `resume_training` | Loads the weight of a specified name in resumable training scenarios. | + | `load` | Loads a model from the path. | `load_checkpoint` | Loads a model from the path. | + | `exit-interval` | Iteration interval for exiting training. | `stop_step` | Number of iterations after which the training is stopped, which is configured in `TrainCallMonitor` of `callbacks`. | + | `exit-duration-in-mins` | Interval for exiting training (in minutes). | Not supported. | | + +- Recomputation configurations + + The recomputation configuration logic of MindSpore Transformers is greatly different from that of Megatron-LM. For details, see [Recomputation](https://www.mindspore.cn/mindformers/docs/en/dev/feature/memory_optimization.html#recomputation). + + | Megatron-LM | Description | MindSpore Transformers | Description | + |--------------------------------|-----------------------|------------------------|--------------------------| + | `recompute-activations` | Specifies whether to enable activation recomputation to save memory. | `recompute` | Specifies whether to enable complete activation recomputation to save memory (`bool`).| + | `recompute-granularity` | Recomputation granularity (for example, **full** or **selective**).| `select_recompute` | Specifies whether to enable selective recomputation. | + | `recompute-method` | Recomputation method (for example, **uniform** or **block**). | Not supported. | | + | `recompute-num-layers` | Number of recomputation layers. | `recompute` | Number of recomputation layers (for example, `tuple` or `list`). | + | `distribute-saved-activations` | Distributed storage activation value. | Not supported. | | + | `checkpoint-activations` | Specifies whether to enable the activation checkpoint mechanism to reduce the video RAM. | Not supported. | | + | `moe-layer-recompute` | Enables recomputation at the MoE layer. | Not supported. | | + +**Note:** The two frameworks have other configurations that are not closely related to training. For details about MindSpore Transformer, see [Configuration Description]. You can run the `torchrun --nproc_per_node=1 pretrain_gpt.py --help` command to view the Megatron-LM configuration. + +### 3.2 Dataset Alignment + +In the precision comparison process, ensure that the two frameworks use the same data input. This section describes how to align the dataset creation and configuration of Megatron-LM and MindSpore Transformers to ensure the consistency of input samples, providing a basis for subsequent weight loading and precision validation. + +#### 3.2.1 Preparing a Dataset + +Both frameworks support loading the Megatron dataset. The dataset is preprocessed, serialized into a binary format (for example, `.bin` or `.idx` file), and accompanied by a specific indexing mechanism, which facilitates efficient parallel loading and data segmentation in a distributed cluster environment. + +- Dataset download: [wikitext-103 dataset](https://dagshub.com/DagsHub/WIkiText-103/src/main/dataset/tokens) + +- Tokenizer model download: [tokenizer.json](https://huggingface.co/deepseek-ai/DeepSeek-V3/resolve/main/tokenizer.json?download=true) + +#### 3.2.2 Processing a Dataset + +- Generating Megatron BIN files + + Place the dataset file `wiki.train.tokens` and the tokenization model file `tokenizer.json` in the `../dataset` directory, and create the `data.json` file by referring to [Megatron Dataset > Data Preprocessing](https://www.mindspore.cn/mindformers/docs/en/dev/feature/dataset.html#data-preprocessing). + + Run the following commands to convert the dataset file into a BIN file: + + ```shell + cd $MINDFORMERS_HOME + python mindformers/tools/dataset_preprocess/preprocess_indexed_dataset.py \ + --input /path/data.json \ + --output-prefix ../dataset/wiki_4096 \ + --vocab-file ../dataset/tokenizer.json \ + --seq-length 4096 \ + --workers 1 + ``` + +- Building the Megatron BIN dataset module + + Run the following commands to build the Megatron BIN dataset module. + + ```shell + pip install pybind11 + cd $MINDFORMERS_HOME/mindformers/dataset/blended_datasets + make + ``` + + `$MINDFORMERS_HOME` indicates the directory where the MindSpore Transformers source code is stored. + +#### 3.2.3 Configuring a Dataset + +This section compares and describes the dataset configuration items in the configuration files of the two frameworks. + +- Megatron-LM: + + The dataset configuration items in the Megatron-LM sample are as follows: + + ```shell + TOKENIZER_MODEL="/path/to/tokenizer.json" + DATA_PATH="/path/to/wiki_text_document" + + DATA_ARGS=( + --tokenizer-type HuggingFaceTokenizer + --tokenizer-model ${TOKENIZER_MODEL} + --data-path $DATA_PATH + --split 1,0,0 + ) + ``` + + In the preceding information: + + - `tokenizer-type`: type of the tokenization model file. + - `tokenizer-model`: location of the tokenization model file `tokenizer.json`, which is accurate to the full file name. + - `data-path`: location of the processed dataset, which is accurate to the prefix of the `.bin` or `.idx` file. + - `split`: sampling ratio of the dataset. + +- MindSpore Transformers: + + The dataset configuration items in the MindSpore Transformers sample are as follows: + + ```yaml + config: # GPTDataset configuration items. + data_path: # Sampling ratio and path of the Megatron dataset. + - '1' + - "/home/to/wiki_text_document" + ``` + + Note that the first parameter of `data_path` is the dataset sampling ratio, and the setting in the example is equivalent to `--split` in the Megatron-LM example. The second parameter is the location of the processed dataset, which is accurate to the prefix of the `.bin` or `.idx` file. The setting in the example is equivalent to `--data-path` in the Megatron-LM example. + +### 3.3 Weight Alignment + +To ensure the consistency of model behavior between different frameworks, the weights obtained after training must be accurately mapped to the corresponding positions in MindSpore Transformers and Megatron-LM through proper weight conversion and segmentation. + +#### Weight Conversion + +The weight formats, parameter naming modes, and tensor arrangements of MindSpore Transformers and Megatron-LM are different. Directly loading the weights will result in incompatibility. Therefore, you need to use a dedicated conversion script to convert the model weights exported from the source framework to the format that can be identified by the target framework. + +1. Generating initial weights of MindSpore Transformers + + Modify the `example.yaml` file by referring to [Callbacks Configuration](https://www.mindspore.cn/mindformers/docs/en/dev/feature/configuration.html#callbacks-configuration) and run the command provided in [Viewing Results](#34-viewing-results) to obtain an initial weight in `checkpoints` of `output_dir` in `example.yaml` through pre-training. The modification is as follows: + + ```yaml + # Before (example.yaml) + load_checkpoint: '/path/to/checkpoints/' + ``` + + ```yaml + # After (example.yaml) + load_checkpoint: '' + + callbacks: + - type: CheckpointMonitor + prefix: "deepseekv3" + save_checkpoint_steps: 1 + keep_checkpoint_max: 2 + integrated_save: False + async_save: False + checkpoint_format: "safetensors" + - type: TrainCallBack + stop_step: 1 + ``` + + **Note**: After obtaining the weight, restore `example.yaml`. + +2. MindSpore Transformers to Megatron-LM + + To accurately map the weights of MindSpore Transformers to the equivalent weights that can be loaded by Megatron-LM, a weight conversion script is provided. You can obtain the equivalent weights by executing the weight conversion script. + +### 3.4 Viewing Results + +After the preceding steps are complete, you can start training and extract key data from the output result in the log to check the precision comparison result. + +- Megatron-LM + + Save the `example.sh` file to the Megatron-LM code directory and run the following command: + + ```shell + bash example.sh + ``` + +- MindSpore Transformers + + Run the following commands in the MindSpore Transformer code directory: + + ```shell + bash scripts/msrun_launcher.sh "run_mindformer.py \ + --config /path/to/example.yaml" + ``` + + `config` is the model configuration file, which is stored in the **config** directory of the MindSpore Transformers code repository. + +- Result comparison + + View the output logs of the two models. The log path of Megatron-LM is `logs/${logtime}.log` in `example.sh`, and that of MindSpore Transformer is `msrun_log/worker_0.log` in `output_dir` of `example.yaml`. The following table lists the comparison results. + + | Megatron-LM | MindSpore Transformers | Description | + |-----------------|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| + | `iteration` | `epoch` and `step` | Number of global iterations during training. In MindSpore Transformers, `(epoch, step)` indicates the current training location, while Megatron-LM uses a single `iteration`. The relationship between them is as follows: `iteration = (epoch – 1) x steps_per_epoch + step`| + | `lm loss` | `loss` | Training loss, which is a core indicator in precision comparison. The value of `loss` of MindSpore Transformers is the sum of `lm loss` and `aux loss`. The values will be printed separately in the future. | + | `learning rate` | `lr` | Learning rate, which is the precision comparison reference indicator. | + | `grand norm` | `global norm` | Global gradient norm, which is the precision comparison reference indicator. | diff --git a/docs/mindformers/docs/source_en/example/distilled/distilled.md b/docs/mindformers/docs/source_en/example/distilled/distilled.md new file mode 100644 index 0000000000..f34b9710f7 --- /dev/null +++ b/docs/mindformers/docs/source_en/example/distilled/distilled.md @@ -0,0 +1,322 @@ +# Practice Case of Using DeepSeek-R1 for Model Distillation + +[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/docs/mindformers/docs/source_zh_cn/example/distilled/distilled.md) + +This case uses OpenR1-Qwen-7B as an example to describe how to use DeepSeek-R1 to perform knowledge distillation and fine-tuning on the Qwen2.5-Math-7B model based on the MindSpore framework and MindSpore Transformers LLM suite, to improve its performance in mathematical inference tasks. This case covers the entire process from environment configuration, data generation, and preprocessing to model fine-tuning and inference testing. You can perform the following steps to learn how to use DeepSeek-R1 to generate inference data, filter out incorrect data, process datasets, and fine-tune the model to solve complex mathematical problems. + +Distillation process: + +![Distillation process](./images/distilled_process.png) + +For more information, see [DeepSeek-R1-Distill-Qwen-7B](https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B). + +## 1. Prerequisites + +### 1.1 Environment + +For details, see [MindSpore Transformers Installation Guidelines](https://www.mindspore.cn/mindformers/docs/en/dev/installation.html). + +Copy the [distilled](https://gitee.com/mindspore/docs/tree/master/docs/mindformers/docs/source_zh_cn/example/distilled/distilled) folder of this case to the root directory of the MindSpore Transformers source code. + +The final directory structure is as follows: + +```bash +mindformers +├── ... +└── distilled + ├── data_process_handling.yaml # Dataset handling configuration file. + ├── data_process_packing.yaml # Dataset packing configuration file. + ├── finetune_qwen_2_5_7b.yaml # Fine-tuning configuration file. + ├── generate_reasoning.py # Script for generating Chain-of-Thought (CoT) data. + └── reject_sampling.py # Rejection sampling script. +``` + +> Commands in this case are executed in the root directory of the MindSpore Transformers source code. + +### 1.2 Model + +The model used for fine-tuning is Qwen2.5-Math-7B-Instruct, which can be downloaded from [Modelers](https://modelers.cn/models/MindSpore-Lab/Qwen2.5-Math-7B-Instruct). + +### 1.3 Dataset + +This case provides three dataset preparation modes: + +- **Generating datasets from scratch**: This mode is suitable for users who want to customize datasets or understand the data generation process, including generating CoT data from seed datasets and rejection sampling. For details, see [1.3.1 Generating Datasets from Scratch](#131-generating-datasets-from-scratch). +- **Using the OpenR1-Math-220K dataset**: + + - **Option 1: Using raw data for offline processing:** This option is suitable for users who need to customize data processing or learn the processing procedure, including preprocessing and packing. For details, see [Option 1: Using raw data for offline processing](#option-1-using-raw-data-for-offline-processing). + - **Option 2: Using converted data:** This option is suitable for users who want to quickly start training. The case provides the preprocessed OpenR1-Math-220K dataset. For details, see [Option 2: Using converted data](#option-2-using-converted-data). + +#### 1.3.1 Generating Datasets from Scratch + +**Application scenario**: This method is suitable for users who want to customize datasets or learn the data generation process. + +> The dataset generation process is only an example. If you want to generate a high-quality dataset, you are advised to refer to the dataset generation process in [OpenR1-Math-220k](https://huggingface.co/datasets/open-r1/OpenR1-Math-220k). + +1. Dependency installation + + Run the following command to install dependencies: + + ```shell + pip install datasets tqdm aiofiles aiohttp uvloop math_verify + ``` + +2. Local deployment of DeepSeek-R1 + + Deploy the DeepSeek-R1 inference service locally by referring to [MindSpore-Lab/DeepSeek-R1 | Modelers](https://modelers.cn/models/MindSpore-Lab/DeepSeek-R1) or use the public API service. + +3. Data generation + + **Objective**: Use the DeepSeek-R1 model to generate CoT inference data for mathematical problems for subsequent data distillation. + + Modify API_KEY in the `generate_reasoning.py` script. + + ```python + API_KEY = "your_api_key_here" + ``` + + Run the following commands to call the inference service API and generate CoT data using the questions in the seed dataset: + + ```shell + python distilled/generate_reasoning.py \ + --model DeepSeek-R1 \ + --dataset-name AI-MO/NuminaMath-1.5 \ + --output-file /path/to/numinamath_r1_generations.jsonl \ + --prompt-column problem \ + --uuid-column problem \ + --api-addr api.host.name \ + --num-generations 2 \ + --max-tokens 16384 \ + --max-concurrent 100 + ``` + + - **Function**: Call the DeepSeek-R1 inference service to generate an inference path based on the mathematical problems (in the `problem` column) in the [AI-MO/NuminaMath-1.5](https://huggingface.co/datasets/AI-MO/NuminaMath-1.5) dataset. + - **Parameters**: + + - **`--model`**: model name of the inference service, which must be the same as the value of `modelName` in the service-oriented configuration file `config.json`. + - **`--dataset-name`**: name of the seed dataset. Set this parameter to the name of the Hugging Face dataset or the local dataset path. + - **`--output-file`**: name of the CoT data file. + - **`--prompt-column`**: column name of the prompt in the seed dataset. The data in this column is used to generate CoT data. + - **`--uuid-column`**: column name of the UUID in the seed dataset. The UUID is used to calculate the hash value to deduplicate data. + - **`--api-addr`**: API address of the inference service. Set this parameter to `IP address:Port number`. + - **`--num-generations`**: number of CoT data records generated for each question in the seed dataset. + - **`--max-tokens`**: maximum number of tokens in the generated CoT data. + - **`--max-concurrent`**: maximum number of concurrent requests. + +4. Rejection sampling + + **Objective**: Filter out incorrect or inaccurate CoT data in the inference data to ensure data quality. + + ``` shell + python distilled/reject_sampling.py \ + --src /path/to/numinamath_r1_generations.jsonl \ + --dst /path/to/numinamath_r1_generations_filtered.jsonl + ``` + + - **Function**: Use the `math_verify` library to verify the inference path in `numinamath_r1_generations.jsonl` and eliminate incorrect CoT data. + - **Parameters**: + + - **`--src`**: path of the input CoT data file. + - **`--dst`**: path of the output filtered CoT data file. + +5. Dataset preprocessing + + Go to **Step 1** in [Option 1: Using raw data for offline processing](#option-1-using-raw-data-for-offline-processing) and convert the generated CoT data to a format supported by MindSpore Transformers. + + **In this case, the dataset is in JSONL format, which is different from the Parquet format of the original dataset. In addition, `data_files` contains only one `numinamath_r1_generations_filtered.jsonl` file. Modify the configuration file `data_process_handling.yaml` in the following format:** + + ```yaml + train_dataset: + ... + data_loader: + ... + path: "json" + data_files: + ["/path/to/numinamath_r1_generations_filtered.jsonl"] + ... + ``` + +#### 1.3.2 Using the OpenR1-Math-220K Dataset + +**Application scenario**: This method is applicable when users want to fine-tune models with high-quality pre-distilled datasets. + +If you fine-tune models with the OpenR1-Math-220K dataset (distilled by DeepSeek-R1), [detailed processes](#option-1-using-raw-data-for-offline-processing) and [converted datasets](#option-2-using-converted-data). + +##### Option 1: Using Raw Data for Offline Processing + +Download the [OpenR1-Math-220K](https://huggingface.co/datasets/open-r1/OpenR1-Math-220K) dataset on Hugging Face. + +Step 1: Preprocess the dataset. + +**Objective**: Convert the original dataset (for example, OpenR1-Math-220K) into a format suitable for MindSpore Transformers fine-tuning. + +You need to modify the dataset processing configuration file `data_process_handling.yaml`. + +1. Copy the `research/qwen2_5/qwen2_5_tokenizer.py` file in the root directory of the MindSpore Transformers source code to the `distilled` directory. + + ```bash + cp research/qwen2_5/qwen2_5_tokenizer.py distilled/ + ``` + +2. Modify the dataset file path: Replace the path in `data_files` with the path of the original dataset. List each Parquet file here. + - Example: `["/path/to/data1.parquet", "/path/to/data2.parquet",...]` +3. Change the tokenizer path: Replace `vocab_file` and `merges_file` with the paths of the **vocabulary file** and **merges file** of the Qwen2.5-7B-Instruct model, respectively. + + ```yaml + train_dataset: + input_columns: &input_columns ["input_ids", "labels"] + data_loader: + ... + data_files: + ["/path/to/data1.parquet", "/path/to/data2.parquet", ...] # Path of the dataset file. + handler: + - type: OpenR1Math220kDataHandler + ... + tokenizer: + ... + vocab_file: "/path/to/vocab.json" # Path of the vocabulary file. + merges_file: "/path/to/merges.txt" # Path of the merges file. + chat_template: ... + ... + ``` + + Run the following data preprocessing script in the root directory of the MindSpore Transformers source code: + + ```shell + python toolkit/data_preprocess/huggingface/datasets_preprocess.py \ + --config distilled/data_process_handling.yaml \ + --save_path /path/to/handled_data \ + --register_path distilled/ + ``` + + - **Function**: Convert the original dataset to a format supported by MindSpore Transformers. + - **Parameters**: + + - **`--config`**: path of the data preprocessing configuration file. + - **`--save_path`**: path of the dataset after conversion. + - **`--register_path`**: registration path, which is the `distilled/` folder in the current directory. + +Step 2: Pack the dataset. + +The dataset packing mechanism is supported in MindSpore Transformers, reducing the time required for fine-tuning. +The dataset packing configuration file is stored in the `/dataset/packing` directory. You need to change the value of `path` to the path of `handled_data`. + +```yaml +# dataset +train_dataset: + data_loader: + ... + path: /path/to/handled_data # Folder for storing the converted dataset. +``` + +Execute the following script in the root directory of the MindSpore Transformers source code: + +```shell +python toolkit/data_preprocess/huggingface/datasets_preprocess.py \ + --config distilled/data_process_packing.yaml \ + --save_path /path/to/packed_data \ + --register_path distilled +``` + +- **Function**: Pack the processed dataset to reduce the data loading time during fine-tuning. +- **Parameters**: + + - **`--config`**: path of the dataset packing configuration file. + - **`--save_path`**: save path of the dataset after packing. + - **`--register_path`**: path for registering the dataset. + +The processed dataset is stored in `packed_data` and is in the arrow format. + +For more information, see [MindSpore Transformers official documentation > Dataset](https://www.mindspore.cn/mindformers/docs/en/dev/feature/dataset.html#custom-data-handler). + +##### Option 2: Using converted data + +Data that can be directly used for model training after being packed in the arrow format. For details, see [Modelers](https://modelers.cn/models/MindSpore-Lab/OpenR1-Qwen-7B/tree/main/dataset/packing). In this case, you need to change the value of `path` in [1.4 YAML Configuration](#14-yaml-configuration) to the path of the downloaded dataset. + +```yaml +train_dataset: + ... + data_loader: + ... + path: "/path/to/OpenR1-Qwen-7B/dataset/packing/" +``` + +### 1.4 YAML Configuration + +Modify the fine-tuning configuration file `finetune_qwen_2_5_7b.yaml` as required. The details are as follows: + +```yaml +seed: 42 +output_dir: './output' +load_checkpoint: "/path/to/Qwen2.5-Math-7B-Instruct" # Path of the weight folder. Change it to the actual path. +load_ckpt_format: 'safetensors' +auto_trans_ckpt: True +only_save_strategy: False +resume_training: False +run_mode: 'finetune' +... +train_dataset: &train_dataset + input_columns: &input_columns ["input_ids", "labels", "loss_mask", "position_ids", "attention_mask"] + divisor: 32 + remainder: 1 + num_parallel_workers: 8 + python_multiprocessing: False + drop_remainder: True + batch_size: 2 + repeat: 1 + numa_enable: False + prefetch_size: 1 + dynamic_batch: True + pad_token_id: 151643 + data_loader: + type: CommonDataLoader + shuffle: True + split: "train" + load_func: "load_from_disk" + path: "/path/to/packed_data" # Path of the dataset folder after packing. +...... +``` + +For details about other parameters, see [MindSpore Transformers official documentation > Supervised Fine-Tuning (SFT)](https://www.mindspore.cn/mindformers/docs/en/dev/guide/supervised_fine_tuning.html). + +## 2. Starting Fine-Tuning + +Set the following environment variables to prevent OOM: + +```bash +export ACLNN_CACHE_LIMIT=10 # CANN cache limit. +export MS_DEV_RUNTIME_CONF="aclnn_cache_queue_length:128" # It is recommended that the MS cache queue length be set to 128. If the value is too large, OOM may occur. If the value is too small, the performance deteriorates. +``` + +Run the following command in the MindSpore Transformers directory to start fine-tuning: + +```bash +bash scripts/msrun_launcher.sh "run_mindformer.py --config distilled/finetune_qwen_2_5_7b.yaml --run_mode finetune" 8 +``` + +Logs are recorded in the `output/msrun_log` directory. For example, you can run the `tail -f output/msrun_log/worker_7.log` command to view the logs of worker 7. +After the fine-tuning is complete, the output `safetensors` weight file is stored in the `output/checkpoint` directory. + +For more information about Safetensors weights, see [MindSpore Transformers official document > Safetensors Weights](https://www.mindspore.cn/mindformers/docs/en/dev/feature/safetensors.html). + +## 3. Inference + +If you want to use the fine-tuned weights for inference, refer to the inference part in [Qwen2.5-Math-7B-Instruct](https://modelers.cn/models/MindSpore-Lab/Qwen2.5-Math-7B-Instruct). However, you need to modify the system prompt in the [run_qwen2_5.py](https://gitee.com/mindspore/mindformers/blob/r1.5.0/research/qwen2_5/run_qwen2_5.py) script. + +```python + messages = [ + {"role": "system", "content": "Please reason step by step, and put your final answer within \\boxed{}."}, + {"role": "user", "content": input_prompt} + ] +``` + +## 4. Evaluation Result + +| Model | MATH-500 | +|-----------------------------------------|:--------:| +| DeepSeek-Distill-Qwen-7B | 91.6 | +| OpenR1-Qwen-7B (Hugging Face) | 90.6 | +| OpenR1-Qwen-7B (MindSpore Transformers) | 90.0 | +| OpenThinker-7B | 89.6 | + +> The third row in the preceding table shows the experiment result of this case, which is obtained from the local test. diff --git a/docs/mindformers/docs/source_en/example/distilled/images/distilled_process.png b/docs/mindformers/docs/source_en/example/distilled/images/distilled_process.png new file mode 100644 index 0000000000000000000000000000000000000000..8c43aac78ce72eb29690bd81588b3fd4df0842d6 GIT binary patch literal 136051 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�YJvY{jk4xFH#=5a}IJBkZ9BQzx2j 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

6D1{OSU&614eAN2W; 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 literal 0 HcmV?d00001 diff --git a/docs/mindformers/docs/source_en/index.rst b/docs/mindformers/docs/source_en/index.rst index 7dc8a5d003..82373babff 100644 --- a/docs/mindformers/docs/source_en/index.rst +++ b/docs/mindformers/docs/source_en/index.rst @@ -118,6 +118,10 @@ Advanced developing with MindSpore Transformers - `Development Migration `_ +- Accuracy Comparison + + - `Compare Training Accuracy with Megatron-LM `_ + Environment Variables ------------------------------------ @@ -188,8 +192,17 @@ FAQ advanced_development/precision_optimization advanced_development/performance_optimization advanced_development/dev_migration + advanced_development/accuracy_comparison advanced_development/api +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Excellent Practice + :hidden: + + example/distilled/distilled + .. toctree:: :glob: :maxdepth: 1 diff --git a/docs/mindformers/docs/source_zh_cn/example/distilled/distilled.md b/docs/mindformers/docs/source_zh_cn/example/distilled/distilled.md index d2df88f004..b345306de4 100644 --- a/docs/mindformers/docs/source_zh_cn/example/distilled/distilled.md +++ b/docs/mindformers/docs/source_zh_cn/example/distilled/distilled.md @@ -8,7 +8,7 @@ ![蒸馏流程](./images/distilled_process.png) -更多信息请参考[DeepSeek-R1-Distill-Qwen-7B](https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B) +更多信息请参考[DeepSeek-R1-Distill-Qwen-7B](https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B)。 ## 1. 前提准备 @@ -103,7 +103,7 @@ mindformers - **`--max-tokens`**:生成的CoT数据的最大Token数。 - **`--max-concurrent`**:请求的最大并发数量。 -1. 拒绝采样 +4. 拒绝采样 **目标**:过滤掉推理数据中的错误或不准确的CoT数据,确保数据质量。 @@ -119,7 +119,7 @@ mindformers - **`--src`**:输入的CoT数据文件路径。 - **`--dst`**:输出的过滤后的CoT数据文件路径。 -2. 数据集预处理 +5. 数据集预处理 跳转到[选项-1-使用原始数据离线处理](#选项-1-使用原始数据离线处理)的中的**步骤一**,并将生成的CoT数据转换为MindSpore Transformers支持的格式。 -- Gitee