From dd36a3a84667cad88a532ae693e854286062d738 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 16:11:39 +0800 Subject: [PATCH 1/8] support ernie_vl --- swift/llm/model/constant.py | 1 + swift/llm/model/model/baidu.py | 31 ++++++++++++++++++++-- swift/llm/model/model_arch.py | 8 ++++++ swift/llm/template/constant.py | 1 + swift/llm/template/template/baidu.py | 22 ++++++++++++--- swift/trainers/rlhf_trainer/gkd_trainer.py | 2 +- 6 files changed, 59 insertions(+), 6 deletions(-) diff --git a/swift/llm/model/constant.py b/swift/llm/model/constant.py index 6f22e04bde..22a5cf48c0 100644 --- a/swift/llm/model/constant.py +++ b/swift/llm/model/constant.py @@ -219,6 +219,7 @@ class MLLMModelType: got_ocr2_hf = 'got_ocr2_hf' step_audio = 'step_audio' kimi_vl = 'kimi_vl' + ernie_vl = 'ernie_vl' phi3_vision = 'phi3_vision' phi4_multimodal = 'phi4_multimodal' diff --git a/swift/llm/model/model/baidu.py b/swift/llm/model/model/baidu.py index a472d24bc0..d1054c0958 100644 --- a/swift/llm/model/model/baidu.py +++ b/swift/llm/model/model/baidu.py @@ -1,8 +1,10 @@ # Copyright (c) Alibaba, Inc. and its affiliates. from swift.llm import TemplateType from swift.utils import get_logger -from ..constant import LLMModelType -from ..register import Model, ModelGroup, ModelMeta, get_model_tokenizer_with_flash_attn, register_model +from ..constant import LLMModelType, MLLMModelType +from ..model_arch import ModelArch +from ..register import (Model, ModelGroup, ModelMeta, get_model_tokenizer_multimodal, + get_model_tokenizer_with_flash_attn, register_model) logger = get_logger() @@ -25,3 +27,28 @@ get_model_tokenizer_with_flash_attn, architectures=['Ernie4_5_ForCausalLM', 'Ernie4_5_MoeForCausalLM'], )) + + +def get_model_tokenizer_ernie_vl(*args, **kwargs): + model, processor = get_model_tokenizer_multimodal(*args, **kwargs) + if model is not None: + model.add_image_preprocess(processor) + return model, processor + + +register_model( + ModelMeta( + MLLMModelType.ernie_vl, + [ + ModelGroup([ + Model('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-Base-PT', 'baidu/ERNIE-4.5-VL-28B-A3B-Base-PT'), + Model('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-PT', 'baidu/ERNIE-4.5-VL-28B-A3B-PT'), + Model('PaddlePaddle/ERNIE-4.5-VL-424B-A47B-Base-PT', 'baidu/ERNIE-4.5-VL-424B-A47B-Base-PT'), + Model('PaddlePaddle/ERNIE-4.5-VL-424B-A47B-PT', 'baidu/ERNIE-4.5-VL-424B-A47B-PT'), + ]), + ], + TemplateType.ernie_vl, + get_model_tokenizer_ernie_vl, + model_arch=ModelArch.ernie_vl, + architectures=['Ernie4_5_VLMoeForConditionalGeneration'], + )) diff --git a/swift/llm/model/model_arch.py b/swift/llm/model/model_arch.py index de54a90b57..e0f84b73c4 100644 --- a/swift/llm/model/model_arch.py +++ b/swift/llm/model/model_arch.py @@ -63,6 +63,7 @@ class MLLMModelArch: idefics3 = 'idefics3' got_ocr2 = 'got_ocr2' + ernie_vl = 'ernie_vl' ovis1_6 = 'ovis1_6' molmo = 'molmo' @@ -535,6 +536,13 @@ def register_model_arch(model_arch: ModelKeys, *, exist_ok: bool = False) -> Non aligner='model.mm_projector_vary', vision_tower='model.vision_tower_high', )) +register_model_arch( + MultiModelKeys( + MLLMModelArch.ernie_vl, + language_model='model', + aligner='model.resampler_model', + vision_tower='vision_model', + )) if transformers_ge_4_52: register_model_arch( diff --git a/swift/llm/template/constant.py b/swift/llm/template/constant.py index 23ceb13429..f025eef424 100644 --- a/swift/llm/template/constant.py +++ b/swift/llm/template/constant.py @@ -176,6 +176,7 @@ class MLLMTemplateType: got_ocr2_hf = 'got_ocr2_hf' step_audio = 'step_audio' kimi_vl = 'kimi_vl' + ernie_vl = 'ernie_vl' idefics3 = 'idefics3' pixtral = 'pixtral' diff --git a/swift/llm/template/template/baidu.py b/swift/llm/template/template/baidu.py index b3b3d45e3b..1165b4e287 100644 --- a/swift/llm/template/template/baidu.py +++ b/swift/llm/template/template/baidu.py @@ -1,10 +1,12 @@ # Copyright (c) Alibaba, Inc. and its affiliates. from dataclasses import dataclass, field -from typing import Optional +from typing import Any, Dict, List, Literal, Optional -from ..constant import LLMTemplateType +from ..base import Template +from ..constant import LLMTemplateType, MLLMTemplateType from ..register import TemplateMeta, register_template -from ..utils import Prompt +from ..template_inputs import StdTemplateInputs +from ..utils import Context, Prompt @dataclass @@ -17,3 +19,17 @@ class ERNIETemplateMeta(TemplateMeta): register_template(ERNIETemplateMeta(LLMTemplateType.ernie)) + + +class ERNIETemplate(Template): + + def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int, + inputs: StdTemplateInputs) -> List[Context]: + return [] + + def _encode(self, inputs: StdTemplateInputs) -> Dict[str, Any]: + encoded = super()._encode(inputs) + return encoded + + +register_template(ERNIETemplateMeta(MLLMTemplateType.ernie_vl, template_cls=ERNIETemplate)) diff --git a/swift/trainers/rlhf_trainer/gkd_trainer.py b/swift/trainers/rlhf_trainer/gkd_trainer.py index d75f3da6e1..2cbd3719d0 100644 --- a/swift/trainers/rlhf_trainer/gkd_trainer.py +++ b/swift/trainers/rlhf_trainer/gkd_trainer.py @@ -12,7 +12,7 @@ from trl import SFTTrainer as HFSFTTrainer from trl.models.utils import prepare_deepspeed -from swift.utils import empty_cache, unwrap_model_for_generation +from swift.utils import unwrap_model_for_generation from ..mixin import SwiftMixin from .rlhf_mixin import RLHFTrainerMixin From bbe70242179799bec19458e4a2b128a0e3ac4be0 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 16:13:46 +0800 Subject: [PATCH 2/8] update --- .../megatron/dense/{72b.sh => 72b_offload.sh} | 0 .../train/megatron/moe/qwen3_moe_offload.sh | 34 +++++++++++++++++++ examples/train/multimodal/video.sh | 10 +++--- 3 files changed, 39 insertions(+), 5 deletions(-) rename examples/train/megatron/dense/{72b.sh => 72b_offload.sh} (100%) create mode 100644 examples/train/megatron/moe/qwen3_moe_offload.sh diff --git a/examples/train/megatron/dense/72b.sh b/examples/train/megatron/dense/72b_offload.sh similarity index 100% rename from examples/train/megatron/dense/72b.sh rename to examples/train/megatron/dense/72b_offload.sh diff --git a/examples/train/megatron/moe/qwen3_moe_offload.sh b/examples/train/megatron/moe/qwen3_moe_offload.sh new file mode 100644 index 0000000000..5836d25490 --- /dev/null +++ b/examples/train/megatron/moe/qwen3_moe_offload.sh @@ -0,0 +1,34 @@ +# 17.5s/it; 8 * 55GiB +NPROC_PER_NODE=8 \ +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +megatron sft \ + --load Qwen3-30B-A3B-Base-mcore \ + --dataset 'liucong/Chinese-DeepSeek-R1-Distill-data-110k-SFT' \ + --expert_model_parallel_size 8 \ + --moe_grouped_gemm true \ + --moe_shared_expert_overlap true \ + --moe_aux_loss_coeff 0.01 \ + --micro_batch_size 1 \ + --global_batch_size 16 \ + --packing true \ + --recompute_granularity full \ + --recompute_method uniform \ + --recompute_num_layers 1 \ + --finetune true \ + --cross_entropy_loss_fusion true \ + --lr 1e-5 \ + --lr_warmup_iters 100 \ + --min_lr 1e-6 \ + --save megatron_output/Qwen3-30B-A3B-Base \ + --eval_interval 200 \ + --save_interval 200 \ + --max_length 8192 \ + --max_epochs 3 \ + --num_workers 8 \ + --dataset_num_proc 8 \ + --no_save_optim true \ + --no_save_rng true \ + --sequence_parallel true \ + --optimizer_cpu_offload true \ + --use_precision_aware_optimizer true \ + --attention_backend flash diff --git a/examples/train/multimodal/video.sh b/examples/train/multimodal/video.sh index 047dc6f736..71c8318fc1 100644 --- a/examples/train/multimodal/video.sh +++ b/examples/train/multimodal/video.sh @@ -1,13 +1,13 @@ -# 4*80GB +# 2*24GB # You can refer to `https://github.com/QwenLM/Qwen2.5-VL` for the meaning of the `VIDEO_MAX_PIXELS` parameter. -nproc_per_node=4 +nproc_per_node=2 -CUDA_VISIBLE_DEVICES=0,1,2,3 \ +CUDA_VISIBLE_DEVICES=0,1 \ NPROC_PER_NODE=$nproc_per_node \ VIDEO_MAX_PIXELS=50176 \ FPS_MAX_FRAMES=12 \ swift sft \ - --model Qwen/QVQ-72B-Preview \ + --model Qwen/Qwen2.5-VL-7B-Instruct \ --dataset swift/VideoChatGPT:all \ --train_type lora \ --torch_dtype bfloat16 \ @@ -28,4 +28,4 @@ swift sft \ --output_dir output \ --warmup_ratio 0.05 \ --dataloader_num_workers 4 \ - --deepspeed zero3 + --deepspeed zero2 From f3c32fcfaaf09e42cce99e7a7af33ff41d727f0f Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 16:42:46 +0800 Subject: [PATCH 3/8] update --- ...6\234\200\344\275\263\345\256\236\350\267\265.md" | 2 +- .../Megatron-SWIFT\350\256\255\347\273\203.md" | 2 +- docs/source_en/BestPractices/Qwen3-Best-Practice.md | 2 +- .../source_en/Instruction/Megatron-SWIFT-Training.md | 2 +- examples/train/megatron/base_to_chat.sh | 2 +- examples/train/megatron/dense/72b_offload.sh | 2 +- examples/train/megatron/dense/qwen3_32b.sh | 2 +- examples/train/megatron/long_text.sh | 2 +- examples/train/megatron/moe/qwen3_moe.sh | 2 +- examples/train/megatron/multi-node/node1.sh | 2 +- examples/train/megatron/multi-node/node2.sh | 2 +- examples/train/megatron/rlhf/dpo/moe.sh | 2 +- examples/train/megatron/sft.sh | 2 +- swift/megatron/argument/megatron_args.py | 12 +++++++++--- 14 files changed, 22 insertions(+), 16 deletions(-) diff --git "a/docs/source/BestPractices/Qwen3\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/docs/source/BestPractices/Qwen3\346\234\200\344\275\263\345\256\236\350\267\265.md" index f16b35a898..cde91a0450 100644 --- "a/docs/source/BestPractices/Qwen3\346\234\200\344\275\263\345\256\236\350\267\265.md" +++ "b/docs/source/BestPractices/Qwen3\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -354,7 +354,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen3-30B-A3B-Base \ --eval_interval 200 \ diff --git "a/docs/source/Instruction/Megatron-SWIFT\350\256\255\347\273\203.md" "b/docs/source/Instruction/Megatron-SWIFT\350\256\255\347\273\203.md" index 6e5d9ebec0..8db5dd396e 100644 --- "a/docs/source/Instruction/Megatron-SWIFT\350\256\255\347\273\203.md" +++ "b/docs/source/Instruction/Megatron-SWIFT\350\256\255\347\273\203.md" @@ -69,7 +69,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 10 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --max_epochs 1 \ --save megatron_output/Qwen2.5-7B-Instruct \ diff --git a/docs/source_en/BestPractices/Qwen3-Best-Practice.md b/docs/source_en/BestPractices/Qwen3-Best-Practice.md index 13e9f43072..4861356ccc 100644 --- a/docs/source_en/BestPractices/Qwen3-Best-Practice.md +++ b/docs/source_en/BestPractices/Qwen3-Best-Practice.md @@ -358,7 +358,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen3-30B-A3B-Base \ --eval_interval 200 \ diff --git a/docs/source_en/Instruction/Megatron-SWIFT-Training.md b/docs/source_en/Instruction/Megatron-SWIFT-Training.md index c8d4b7079c..8a627dd9b4 100644 --- a/docs/source_en/Instruction/Megatron-SWIFT-Training.md +++ b/docs/source_en/Instruction/Megatron-SWIFT-Training.md @@ -70,7 +70,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 10 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --max_epochs 1 \ --save megatron_output/Qwen2.5-7B-Instruct \ diff --git a/examples/train/megatron/base_to_chat.sh b/examples/train/megatron/base_to_chat.sh index d4e0c6e421..e1df583f0c 100644 --- a/examples/train/megatron/base_to_chat.sh +++ b/examples/train/megatron/base_to_chat.sh @@ -14,7 +14,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen2.5-14B \ --eval_interval 200 \ diff --git a/examples/train/megatron/dense/72b_offload.sh b/examples/train/megatron/dense/72b_offload.sh index c78a20afc6..440373f5be 100644 --- a/examples/train/megatron/dense/72b_offload.sh +++ b/examples/train/megatron/dense/72b_offload.sh @@ -18,7 +18,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen2.5-72B-Instruct \ --eval_interval 500 \ diff --git a/examples/train/megatron/dense/qwen3_32b.sh b/examples/train/megatron/dense/qwen3_32b.sh index 0e023c23b0..cbc42ef4e0 100644 --- a/examples/train/megatron/dense/qwen3_32b.sh +++ b/examples/train/megatron/dense/qwen3_32b.sh @@ -18,7 +18,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen3-32B \ --eval_interval 500 \ diff --git a/examples/train/megatron/long_text.sh b/examples/train/megatron/long_text.sh index 5f87d8c075..86f4a715cb 100644 --- a/examples/train/megatron/long_text.sh +++ b/examples/train/megatron/long_text.sh @@ -19,7 +19,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen2.5-7B \ --eval_interval 200 \ diff --git a/examples/train/megatron/moe/qwen3_moe.sh b/examples/train/megatron/moe/qwen3_moe.sh index c4b241149c..8f8b769095 100644 --- a/examples/train/megatron/moe/qwen3_moe.sh +++ b/examples/train/megatron/moe/qwen3_moe.sh @@ -23,7 +23,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen3-30B-A3B-Base \ --eval_interval 200 \ diff --git a/examples/train/megatron/multi-node/node1.sh b/examples/train/megatron/multi-node/node1.sh index 46307cc9d9..4fd7ca58c0 100644 --- a/examples/train/megatron/multi-node/node1.sh +++ b/examples/train/megatron/multi-node/node1.sh @@ -20,7 +20,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen2.5-14B \ --eval_interval 200 \ diff --git a/examples/train/megatron/multi-node/node2.sh b/examples/train/megatron/multi-node/node2.sh index 9402e6e6f3..38a6c18dd7 100644 --- a/examples/train/megatron/multi-node/node2.sh +++ b/examples/train/megatron/multi-node/node2.sh @@ -17,7 +17,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen2.5-14B \ --eval_interval 200 \ diff --git a/examples/train/megatron/rlhf/dpo/moe.sh b/examples/train/megatron/rlhf/dpo/moe.sh index 6026fc3843..300999e34e 100644 --- a/examples/train/megatron/rlhf/dpo/moe.sh +++ b/examples/train/megatron/rlhf/dpo/moe.sh @@ -19,7 +19,7 @@ megatron rlhf \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen1.5-MoE-A2.7B \ --eval_interval 200 \ diff --git a/examples/train/megatron/sft.sh b/examples/train/megatron/sft.sh index 05bf13b9c6..37b0670619 100644 --- a/examples/train/megatron/sft.sh +++ b/examples/train/megatron/sft.sh @@ -16,7 +16,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 10 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --max_epochs 1 \ --save megatron_output/Qwen2.5-7B-Instruct \ diff --git a/swift/megatron/argument/megatron_args.py b/swift/megatron/argument/megatron_args.py index 9fafd9e0e9..db528a3f95 100644 --- a/swift/megatron/argument/megatron_args.py +++ b/swift/megatron/argument/megatron_args.py @@ -60,7 +60,7 @@ class MegatronArguments(ExtraMegatronArguments): no_masked_softmax_fusion: bool = False no_bias_dropout_fusion: bool = False no_bias_swiglu_fusion: bool = False - no_rope_fusion: bool = False + no_rope_fusion: Optional[bool] = None no_gradient_accumulation_fusion: bool = False cross_entropy_loss_fusion: bool = False cross_entropy_fusion_impl: Literal['native', 'te'] = 'native' @@ -323,10 +323,16 @@ def __post_init__(self): self.tensorboard_dir = to_abspath(self.tensorboard_dir) self.extra_megatron_kwargs = ModelArguments.parse_to_dict(self.extra_megatron_kwargs) - if self.multi_latent_attention and not self.no_rope_fusion: + + def _init_no_rope_fusion(): + if self.no_rope_fusion is not None: + return + if self.multi_latent_attention or self.rotary_interleaved: # Upgrading transformer_engine requires checking here. self.no_rope_fusion = True - logger.info(f'Due to enabling multi_latent_attention, set args.no_rope_fusion to {self.no_rope_fusion}.') + else: + self.no_rope_fusion = False + logger.info(f'Setting args.no_rope_fusion: {self.no_rope_fusion}.') def _args_to_argv(self) -> Tuple[List[Any], Dict[str, Any]]: new_args = [] From c14316ab4fc370fd61d9bfecdbddc9956b78a3b4 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 16:54:33 +0800 Subject: [PATCH 4/8] update --- examples/train/megatron/moe/qwen3_moe_offload.sh | 2 +- swift/megatron/argument/megatron_args.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/train/megatron/moe/qwen3_moe_offload.sh b/examples/train/megatron/moe/qwen3_moe_offload.sh index 5836d25490..2cf8ff3242 100644 --- a/examples/train/megatron/moe/qwen3_moe_offload.sh +++ b/examples/train/megatron/moe/qwen3_moe_offload.sh @@ -17,7 +17,7 @@ megatron sft \ --finetune true \ --cross_entropy_loss_fusion true \ --lr 1e-5 \ - --lr_warmup_iters 100 \ + --lr_warmup_fraction 0.05 \ --min_lr 1e-6 \ --save megatron_output/Qwen3-30B-A3B-Base \ --eval_interval 200 \ diff --git a/swift/megatron/argument/megatron_args.py b/swift/megatron/argument/megatron_args.py index db528a3f95..8f24729728 100644 --- a/swift/megatron/argument/megatron_args.py +++ b/swift/megatron/argument/megatron_args.py @@ -323,8 +323,9 @@ def __post_init__(self): self.tensorboard_dir = to_abspath(self.tensorboard_dir) self.extra_megatron_kwargs = ModelArguments.parse_to_dict(self.extra_megatron_kwargs) + self._init_no_rope_fusion() - def _init_no_rope_fusion(): + def _init_no_rope_fusion(self): if self.no_rope_fusion is not None: return if self.multi_latent_attention or self.rotary_interleaved: From c8e94e8f5d7ae8ed275b6c648837db0071b9a9c7 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 18:38:06 +0800 Subject: [PATCH 5/8] update --- swift/megatron/argument/train_args.py | 1 + 1 file changed, 1 insertion(+) diff --git a/swift/megatron/argument/train_args.py b/swift/megatron/argument/train_args.py index e124c188df..ffea1e32a2 100644 --- a/swift/megatron/argument/train_args.py +++ b/swift/megatron/argument/train_args.py @@ -39,6 +39,7 @@ def _init_save(self): os.makedirs(self.save, exist_ok=True) def __post_init__(self): + self.train_type = 'full' # only support full self.sequence_parallel_size = self.context_parallel_size self.load = to_abspath(self.load, check_path_exist=True) BaseArguments.__post_init__(self) From f7dba5d8142e505049186366fad4541eeb51efd0 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Mon, 30 Jun 2025 18:57:18 +0800 Subject: [PATCH 6/8] update wechat --- asset/wechat.png | Bin 75907 -> 24018 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/asset/wechat.png b/asset/wechat.png index adc0f88ed4c3d527b7605c15908156d854fb1b8b..455156d4f4d4f514f45228452cdc515bf1d94efa 100644 GIT binary patch literal 24018 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 Date: Mon, 30 Jun 2025 19:14:15 +0800 Subject: [PATCH 7/8] update --- examples/train/megatron/moe/qwen3_moe_offload.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/train/megatron/moe/qwen3_moe_offload.sh b/examples/train/megatron/moe/qwen3_moe_offload.sh index 2cf8ff3242..514a95fccc 100644 --- a/examples/train/megatron/moe/qwen3_moe_offload.sh +++ b/examples/train/megatron/moe/qwen3_moe_offload.sh @@ -1,10 +1,10 @@ -# 17.5s/it; 8 * 55GiB -NPROC_PER_NODE=8 \ -CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +# 28s/it; 4 * 75GiB +NPROC_PER_NODE=4 \ +CUDA_VISIBLE_DEVICES=0,1,2,3 \ megatron sft \ --load Qwen3-30B-A3B-Base-mcore \ --dataset 'liucong/Chinese-DeepSeek-R1-Distill-data-110k-SFT' \ - --expert_model_parallel_size 8 \ + --expert_model_parallel_size 4 \ --moe_grouped_gemm true \ --moe_shared_expert_overlap true \ --moe_aux_loss_coeff 0.01 \ From fa3cf75f088edd4107f4e2d7df9578b0cac445aa Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Sun, 13 Jul 2025 14:36:39 +0800 Subject: [PATCH 8/8] update --- swift/llm/model/model/baidu.py | 1 + swift/llm/model/utils.py | 6 ++-- swift/llm/template/template/baidu.py | 31 +++++++++++++++++-- swift/llm/template/utils.py | 12 +++++++ tests/test_align/test_template/test_vision.py | 15 ++++++++- 5 files changed, 59 insertions(+), 6 deletions(-) diff --git a/swift/llm/model/model/baidu.py b/swift/llm/model/model/baidu.py index d1054c0958..0cad2eb10a 100644 --- a/swift/llm/model/model/baidu.py +++ b/swift/llm/model/model/baidu.py @@ -51,4 +51,5 @@ def get_model_tokenizer_ernie_vl(*args, **kwargs): get_model_tokenizer_ernie_vl, model_arch=ModelArch.ernie_vl, architectures=['Ernie4_5_VLMoeForConditionalGeneration'], + requires=['transformers>=4.52'], )) diff --git a/swift/llm/model/utils.py b/swift/llm/model/utils.py index 883a3570e3..a088a61b62 100644 --- a/swift/llm/model/utils.py +++ b/swift/llm/model/utils.py @@ -150,7 +150,7 @@ def get_max_model_len(config: Union[PretrainedConfig, Dict[str, Any]]) -> Option INF = int(1e9) max_model_len = INF - possible_keys = [ + possible_keys = { 'seq_length', # qwen, chatglm 'max_position_embeddings', # qwen1.5, llama2 'n_positions', # polylm, phi-2 @@ -160,7 +160,9 @@ def get_max_model_len(config: Union[PretrainedConfig, Dict[str, Any]]) -> Option 'max_seq_len', 'max_sequence_length', 'max_seq_length', - ] + } + if getattr(config, 'model_type', None) == 'ernie4_5_moe_vl': + possible_keys.discard('max_sequence_length') for key in possible_keys: max_len_key = HfConfigFactory.get_config_attr(config, key) if max_len_key is not None: diff --git a/swift/llm/template/template/baidu.py b/swift/llm/template/template/baidu.py index 1165b4e287..628f0e3848 100644 --- a/swift/llm/template/template/baidu.py +++ b/swift/llm/template/template/baidu.py @@ -6,8 +6,8 @@ from ..constant import LLMTemplateType, MLLMTemplateType from ..register import TemplateMeta, register_template from ..template_inputs import StdTemplateInputs -from ..utils import Context, Prompt - +from ..utils import Context, Prompt, align_image_inputs, findall, split_tokens +import torch.nn.functional as F @dataclass class ERNIETemplateMeta(TemplateMeta): @@ -22,14 +22,39 @@ class ERNIETemplateMeta(TemplateMeta): class ERNIETemplate(Template): + placeholder_tokens = ['<|IMAGE_PLACEHOLDER|>'] def replace_tag(self, media_type: Literal['image', 'video', 'audio'], index: int, inputs: StdTemplateInputs) -> List[Context]: - return [] + assert media_type == 'image' + return [f'Picture {index+1}:<|IMAGE_START|><|IMAGE_PLACEHOLDER|><|IMAGE_END|>'] def _encode(self, inputs: StdTemplateInputs) -> Dict[str, Any]: encoded = super()._encode(inputs) + input_ids = encoded['input_ids'] + labels = encoded['labels'] + if inputs.images: + text = self.processor.decode(input_ids).replace('<|IMAGE_PLACEHOLDER|>', '<|image@placeholder|>') + new_inputs = self.processor( + text=[text], + images=inputs.images, + videos=inputs.videos, + padding=True, + return_tensors='pt', + ) + encoded.update(new_inputs) + new_input_ids = new_inputs['input_ids'][0].tolist() + encoded['input_ids'], encoded['labels'] = align_image_inputs(input_ids, labels, new_input_ids, + self.placeholder_tokens[0]) + encoded['position_ids'] = encoded['position_ids'][0] return encoded + def _data_collator(self, batch: List[Dict[str, Any]], *, padding_to: Optional[int] = None) -> Dict[str, Any]: + res = {} + for key in ['images', 'grid_thw', 'image_type_ids']: + res[key] = self.concat_tensor(batch, key, 0) + res.update(super()._data_collator(batch, padding_to=padding_to)) + return res + register_template(ERNIETemplateMeta(MLLMTemplateType.ernie_vl, template_cls=ERNIETemplate)) diff --git a/swift/llm/template/utils.py b/swift/llm/template/utils.py index 172dcb3205..f61d4e2102 100644 --- a/swift/llm/template/utils.py +++ b/swift/llm/template/utils.py @@ -61,6 +61,16 @@ def fetch_one(element: Union[Tuple, List, Set, Dict, Any], item_type: Optional[T return element +def split_tokens(tokens: List[int], sub_tokens: Union[int, List[int]]) -> List[List[int]]: + split_idx = findall(tokens, sub_tokens) + split_idx = [-1, *split_idx, len(tokens)] + res = [] + for i in range(len(split_idx) - 1): + idx, idx_next = split_idx[i] + 1, split_idx[i + 1] + res.append(tokens[idx:idx_next]) + return res + + def findall(token_list: List[int], sub_token_list: Union[int, List[int]]) -> List[int]: """Find the index of a token in the token_list.""" if isinstance(sub_token_list, int): @@ -82,6 +92,8 @@ def align_image_inputs(input_ids: List[int], labels: List[int], new_input_ids, if isinstance(new_input_ids, torch.Tensor): new_input_ids = new_input_ids.tolist() + if labels is None: + return new_input_ids, None # Find the tokens after the image_token in input_ids, and then align them. i, j = 0, 0 while i < len(input_ids): diff --git a/tests/test_align/test_template/test_vision.py b/tests/test_align/test_template/test_vision.py index 40798ecf56..298ccff31d 100644 --- a/tests/test_align/test_template/test_vision.py +++ b/tests/test_align/test_template/test_vision.py @@ -563,6 +563,18 @@ def test_kimi_vl_thinking(): 'The second image is an illustration of four sheep in a car') +def test_ernie_vl(): + pt_engine = PtEngine('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-PT') + messages = [{'role': 'user', 'content': 'What is the difference between the two images?'}] + images = [ + 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/cat.png', + 'http://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/animal.png' + ] + response = _infer_model(pt_engine, messages=messages, images=images) + pt_engine.default_template.template_backend = 'jinja' + response2 = _infer_model(pt_engine, messages=messages, images=images) + assert response == response2 + if __name__ == '__main__': from swift.llm import PtEngine, RequestConfig from swift.utils import get_logger, seed_everything @@ -616,4 +628,5 @@ def test_kimi_vl_thinking(): # test_internvl3_8b() # test_internvl3_9b() # test_kimi_vl() - test_kimi_vl_thinking() + # test_kimi_vl_thinking() + test_ernie_vl()