[data] fix qwen omni plugin (#9204)
Co-authored-by: kingsley <kingsleydodonow@gmail.com>
This commit is contained in:
@@ -29,33 +29,30 @@ import shutil
|
||||
|
||||
import fire
|
||||
from peft import PeftModel
|
||||
from transformers import (
|
||||
AutoProcessor,
|
||||
Qwen2_5OmniForConditionalGeneration, # type: ignore
|
||||
Qwen2_5OmniThinkerForConditionalGeneration,
|
||||
)
|
||||
from transformers import AutoConfig, AutoModelForTextToWaveform, AutoProcessor
|
||||
from transformers.utils import cached_file
|
||||
|
||||
|
||||
def merge_lora(
|
||||
base_model_path: str,
|
||||
lora_checkpoint_path: str,
|
||||
model_path: str,
|
||||
lora_path: str,
|
||||
save_path: str = "./merged_model_checkpoint",
|
||||
extra_file: str = "spk_dict.pt",
|
||||
submodule_name: str = "thinker",
|
||||
save_path: str = "./merged_model_checkpoint",
|
||||
):
|
||||
"""Load the original model, merge the LoRA weights.
|
||||
|
||||
For a specified submodule, and save the final merged model along with its configurations.
|
||||
|
||||
Args:
|
||||
base_model_path (str): Path to the original model directory.
|
||||
lora_checkpoint_path (str): Path to the directory containing LoRA weights.
|
||||
model_path (str): Path to the original model directory.
|
||||
lora_path (str): Path to the directory containing LoRA weights.
|
||||
save_path (str): Directory where the merged model and configurations will be saved.
|
||||
extra_file (str): Name of the extra file to be copied (default: "spk_dict.pt").
|
||||
submodule_name (str): Name of the submodule to merge (default: "thinker").
|
||||
save_path (str): Directory where the merged model and configurations will be saved.
|
||||
"""
|
||||
# 1. Load the original model
|
||||
model = Qwen2_5OmniForConditionalGeneration.from_pretrained(base_model_path, torch_dtype="auto", device_map="cpu")
|
||||
model = AutoModelForTextToWaveform.from_pretrained(model_path, torch_dtype="auto", device_map="cpu")
|
||||
print("Successfully loaded the original model.")
|
||||
|
||||
# 2. Extract the submodule to be merged (e.g., model.thinker)
|
||||
@@ -66,13 +63,13 @@ def merge_lora(
|
||||
print(f"Successfully extracted submodule: {submodule_name}.")
|
||||
|
||||
# 3. Load the LoRA weights onto the extracted submodule
|
||||
lora_model = PeftModel.from_pretrained(base_submodule, lora_checkpoint_path)
|
||||
processor = AutoProcessor.from_pretrained(lora_checkpoint_path)
|
||||
print("LoRA weights and processor loaded successfully.")
|
||||
lora_model = PeftModel.from_pretrained(base_submodule, lora_path)
|
||||
processor = AutoProcessor.from_pretrained(lora_path)
|
||||
print("Successfully loaded LoRA weights and processor.")
|
||||
|
||||
# 4. Merge the LoRA weights into the submodule and unload the LoRA modules
|
||||
merged_submodule = lora_model.merge_and_unload()
|
||||
print("LoRA weights merged successfully.")
|
||||
print("Successfully merged LoRA weights.")
|
||||
|
||||
# 5. Replace the original submodule with the merged submodule in the model
|
||||
setattr(model, submodule_name, merged_submodule)
|
||||
@@ -80,20 +77,19 @@ def merge_lora(
|
||||
# 6. Save the final merged model along with the tokenizer and processor configuration
|
||||
model.save_pretrained(save_path)
|
||||
processor.save_pretrained(save_path)
|
||||
print(f"Merged model and tokenizer saved to {save_path}.")
|
||||
print(f"Merged model and processor saved to {save_path}.")
|
||||
|
||||
source_file = os.path.join(base_model_path, extra_file)
|
||||
target_file = os.path.join(save_path, extra_file)
|
||||
if os.path.exists(source_file):
|
||||
shutil.copy(source_file, target_file)
|
||||
print(f"File '{extra_file}' copied from {base_model_path} to {save_path}.")
|
||||
else:
|
||||
print(f"File '{extra_file}' not found in {base_model_path}, skipping copy.")
|
||||
try:
|
||||
source_file = cached_file(path_or_repo_id=model_path, filename=extra_file)
|
||||
shutil.copy(source_file, os.path.join(save_path, extra_file))
|
||||
print(f"File '{extra_file}' copied from {model_path} to {save_path}.")
|
||||
except Exception:
|
||||
print(f"File '{extra_file}' not found in {model_path}, skipping copy.")
|
||||
|
||||
|
||||
def save_full_model(
|
||||
saved_thinker_path: str,
|
||||
base_model_path: str,
|
||||
model_path: str,
|
||||
thinker_path: str,
|
||||
save_path: str = "./merged_model_checkpoint",
|
||||
extra_file: str = "spk_dict.pt",
|
||||
):
|
||||
@@ -102,34 +98,42 @@ def save_full_model(
|
||||
Then save the complete model along with its tokenizer and processor configuration.
|
||||
|
||||
Args:
|
||||
saved_thinker_path (str): Path to the saved thinker weights.
|
||||
base_model_path (str): Directory path of the original model.
|
||||
model_path (str): Directory path of the original model.
|
||||
thinker_path (str): Path to the saved thinker weights.
|
||||
save_path (str): Directory where the merged model and configurations will be saved.
|
||||
extra_file (str): Name of the extra file to be copied (default: "spk_dict.pt").
|
||||
"""
|
||||
# 1. Load the saved thinker module and the original model
|
||||
thinker = Qwen2_5OmniThinkerForConditionalGeneration.from_pretrained(
|
||||
saved_thinker_path, torch_dtype="auto", device_map="cpu"
|
||||
)
|
||||
base_model = Qwen2_5OmniForConditionalGeneration.from_pretrained(
|
||||
base_model_path, torch_dtype="auto", device_map="cpu"
|
||||
)
|
||||
config = AutoConfig.from_pretrained(model_path)
|
||||
if getattr(config, "model_type") == "qwen2_5_omni":
|
||||
from transformers.models.qwen2_5_omni import Qwen2_5OmniThinkerForConditionalGeneration # type: ignore
|
||||
|
||||
ThinkerClass = Qwen2_5OmniThinkerForConditionalGeneration
|
||||
elif getattr(config, "model_type") == "qwen3_omni_moe":
|
||||
from transformers.models.qwen3_omni_moe import Qwen3OmniMoeThinkerForConditionalGeneration # type: ignore
|
||||
|
||||
ThinkerClass = Qwen3OmniMoeThinkerForConditionalGeneration
|
||||
else:
|
||||
raise ValueError(f"Unsupported model type: {getattr(config, 'model_type')}.")
|
||||
|
||||
thinker = ThinkerClass.from_pretrained(thinker_path, torch_dtype="auto", device_map="cpu")
|
||||
base_model = AutoModelForTextToWaveform.from_pretrained(model_path, torch_dtype="auto", device_map="cpu")
|
||||
base_model.thinker = thinker
|
||||
processor = AutoProcessor.from_pretrained(thinker_path)
|
||||
print("Successfully loaded model weights and processor.")
|
||||
|
||||
# 2. Save the complete model along with its tokenizer and processor configuration
|
||||
processor = AutoProcessor.from_pretrained(saved_thinker_path)
|
||||
base_model.save_pretrained(save_path)
|
||||
processor.save_pretrained(save_path)
|
||||
print(f"Merged model and processor saved to {save_path}.")
|
||||
|
||||
# 3. Copy the extra file from the base model directory to the save_path
|
||||
source_file = os.path.join(base_model_path, extra_file)
|
||||
target_file = os.path.join(save_path, extra_file)
|
||||
if os.path.exists(source_file):
|
||||
shutil.copy(source_file, target_file)
|
||||
print(f"File '{extra_file}' copied from {base_model_path} to {save_path}.")
|
||||
else:
|
||||
print(f"File '{extra_file}' not found in {base_model_path}, skipping copy.")
|
||||
try:
|
||||
source_file = cached_file(path_or_repo_id=model_path, filename=extra_file)
|
||||
shutil.copy(source_file, os.path.join(save_path, extra_file))
|
||||
print(f"File '{extra_file}' copied from {model_path} to {save_path}.")
|
||||
except Exception:
|
||||
print(f"File '{extra_file}' not found in {model_path}, skipping copy.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user