From dfab6612ef84cf33b4247717bd6b3d7db1d0b41a Mon Sep 17 00:00:00 2001 From: xrysamuel Date: Tue, 1 Oct 2024 22:25:05 +0800 Subject: [PATCH 1/3] Add examples/sec_emotioncaps --- examples/sec_emotioncaps/README.md | 1 + examples/sec_emotioncaps/conf/ds_config.json | 19 +++ examples/sec_emotioncaps/conf/prompt.yaml | 3 + examples/sec_emotioncaps/finetune_sec.py | 49 ++++++ .../sec_emotioncaps/inference_sec_batch.py | 53 ++++++ .../sec_emotioncaps/model/slam_model_sec.py | 155 ++++++++++++++++++ .../decode_emotion2vec_qformer_vicuna_7b.sh | 63 +++++++ .../finetune_emotion2vec_qformer_vicuna_7b.sh | 77 +++++++++ examples/sec_emotioncaps/sec_config.py | 127 ++++++++++++++ src/slam_llm/models/encoder.py | 12 ++ src/slam_llm/models/slam_model.py | 5 + 11 files changed, 564 insertions(+) create mode 100644 examples/sec_emotioncaps/README.md create mode 100644 examples/sec_emotioncaps/conf/ds_config.json create mode 100644 examples/sec_emotioncaps/conf/prompt.yaml create mode 100644 examples/sec_emotioncaps/finetune_sec.py create mode 100644 examples/sec_emotioncaps/inference_sec_batch.py create mode 100644 examples/sec_emotioncaps/model/slam_model_sec.py create mode 100644 examples/sec_emotioncaps/scripts/decode_emotion2vec_qformer_vicuna_7b.sh create mode 100644 examples/sec_emotioncaps/scripts/finetune_emotion2vec_qformer_vicuna_7b.sh create mode 100644 examples/sec_emotioncaps/sec_config.py diff --git a/examples/sec_emotioncaps/README.md b/examples/sec_emotioncaps/README.md new file mode 100644 index 00000000..3dbff491 --- /dev/null +++ b/examples/sec_emotioncaps/README.md @@ -0,0 +1 @@ +# Speech Emotion Caption \ No newline at end of file diff --git a/examples/sec_emotioncaps/conf/ds_config.json b/examples/sec_emotioncaps/conf/ds_config.json new file mode 100644 index 00000000..7ea70e4a --- /dev/null +++ b/examples/sec_emotioncaps/conf/ds_config.json @@ -0,0 +1,19 @@ +{ + "train_micro_batch_size_per_gpu": 4, + "gradient_accumulation_steps": 1, + "optimizer": { + "type": "Adam", + "params": { + "lr": 1e-4 + } + }, + "fp16": { + "enabled": true + }, + "zero_optimization": { + "stage": 3, + "offload_optimizer": { + "device": "cpu" + } + } +} \ No newline at end of file diff --git a/examples/sec_emotioncaps/conf/prompt.yaml b/examples/sec_emotioncaps/conf/prompt.yaml new file mode 100644 index 00000000..400cbfa2 --- /dev/null +++ b/examples/sec_emotioncaps/conf/prompt.yaml @@ -0,0 +1,3 @@ +dataset_config: + # we put prompt here, because the hydra override in shell script only support a small subset of chars + prompt: "请用中文用一句话描述上面给出的音频中说话人的情感。" diff --git a/examples/sec_emotioncaps/finetune_sec.py b/examples/sec_emotioncaps/finetune_sec.py new file mode 100644 index 00000000..f417daa9 --- /dev/null +++ b/examples/sec_emotioncaps/finetune_sec.py @@ -0,0 +1,49 @@ +from slam_llm.pipeline.finetune import main as train + +import hydra +import logging +from typing import Optional +from dataclasses import dataclass, field +from omegaconf import DictConfig, ListConfig, OmegaConf +from sec_config import ModelConfig, TrainConfig, DataConfig, LogConfig, FSDPConfig + +@dataclass +class RunConfig: + dataset_config: DataConfig = field(default_factory=DataConfig) + model_config: ModelConfig = field(default_factory=ModelConfig) + train_config: TrainConfig = field(default_factory=TrainConfig) + log_config: LogConfig = field(default_factory=LogConfig) + fsdp_config: FSDPConfig = field(default_factory=FSDPConfig) + debug: bool = field(default=False, metadata={"help": "Use pdb when true"}) + metric: str = field(default="acc", metadata={"help": "The metric for evaluation"}) + ckpt_path: Optional[str] = field( + default=None, metadata={"help": "The path to projector checkpoint"} + ) + +@hydra.main(config_name=None, version_base=None) +def main_hydra(cfg: DictConfig): + run_config = RunConfig() + cfg = OmegaConf.merge(run_config, cfg) + def to_plain_list(cfg_item): + if isinstance(cfg_item, ListConfig): + return OmegaConf.to_container(cfg_item, resolve=True) + elif isinstance(cfg_item, DictConfig): + return {k: to_plain_list(v) for k, v in cfg_item.items()} + else: + return cfg_item + + # kwargs = to_plain_list(cfg) + kwargs = cfg + log_level = getattr(logging, kwargs.get("log_level", "INFO").upper()) + + logging.basicConfig(level=log_level) + + if kwargs.get("debug", False): + import pdb; + pdb.set_trace() + + train(kwargs) + + +if __name__ == "__main__": + main_hydra() diff --git a/examples/sec_emotioncaps/inference_sec_batch.py b/examples/sec_emotioncaps/inference_sec_batch.py new file mode 100644 index 00000000..49389782 --- /dev/null +++ b/examples/sec_emotioncaps/inference_sec_batch.py @@ -0,0 +1,53 @@ +from slam_llm.pipeline.inference_batch import main as inference + +import hydra +import logging +from dataclasses import dataclass, field +from omegaconf import DictConfig, ListConfig, OmegaConf +from typing import Optional +from sec_config import ModelConfig, TrainConfig, DataConfig, LogConfig, FSDPConfig + + +@dataclass +class RunConfig: + dataset_config: DataConfig = field(default_factory=DataConfig) + model_config: ModelConfig = field(default_factory=ModelConfig) + train_config: TrainConfig = field(default_factory=TrainConfig) + log_config: LogConfig = field(default_factory=LogConfig) + fsdp_config: FSDPConfig = field(default_factory=FSDPConfig) + debug: bool = field(default=False, metadata={"help": "Use pdb when true"}) + metric: str = field(default="acc", metadata={"help": "The metric for evaluation"}) + decode_log: str = field( + default="output/decode_log", + metadata={"help": "The prefix for the decode output"}, + ) + ckpt_path: str = field( + default="output/model.pt", metadata={"help": "The path to projector checkpoint"} + ) + peft_ckpt: Optional[str] = field( + default=None, + metadata={ + "help": "The path to peft checkpoint, should be a directory including adapter_config.json" + }, + ) + + +@hydra.main(config_name=None, version_base=None) +def main_hydra(cfg: DictConfig): + run_config = RunConfig() + cfg = OmegaConf.merge(run_config, cfg) + # kwargs = to_plain_list(cfg) + log_level = getattr(logging, cfg.get("log_level", "INFO").upper()) + + logging.basicConfig(level=log_level) + + if cfg.get("debug", False): + import pdb + + pdb.set_trace() + + inference(cfg) + + +if __name__ == "__main__": + main_hydra() diff --git a/examples/sec_emotioncaps/model/slam_model_sec.py b/examples/sec_emotioncaps/model/slam_model_sec.py new file mode 100644 index 00000000..0910d2ed --- /dev/null +++ b/examples/sec_emotioncaps/model/slam_model_sec.py @@ -0,0 +1,155 @@ +import torch +import os +import logging +from slam_llm.models.slam_model import ( + slam_model, + setup_tokenizer, + setup_encoder, + setup_encoder_projector, + setup_llm, +) +from slam_llm.utils.train_utils import print_model_size + +logger = logging.getLogger(__name__) + +def model_factory(train_config, model_config, **kwargs): + # return necessary components for training + tokenizer = setup_tokenizer(train_config, model_config, **kwargs) + + encoder = setup_encoder(train_config, model_config, **kwargs) + + # llm + llm = setup_llm(train_config, model_config, **kwargs) + + # projector + encoder_projector = setup_encoder_projector( + train_config, model_config, **kwargs + ) + model = slam_model_asr( + encoder, + llm, + encoder_projector, + tokenizer, + train_config, + model_config, + **kwargs, + ) + + ckpt_path = kwargs.get( + "ckpt_path", None + ) # FIX(MZY): load model ckpt(mainly projector, related to model_checkpointing/checkpoint_handler.py: save_model_checkpoint_peft) + if ckpt_path is not None: + logger.info("loading other parts from: {}".format(ckpt_path)) + ckpt_dict = torch.load(ckpt_path, map_location="cpu") + model.load_state_dict(ckpt_dict, strict=False) + + print_model_size( + model, + train_config, + ( + int(os.environ["RANK"]) + if train_config.enable_fsdp or train_config.enable_ddp + else 0 + ), + ) + return model, tokenizer + + +class slam_model_asr(slam_model): + def __init__( + self, + encoder, + llm, + encoder_projector, + tokenizer, + train_config, + model_config, + **kwargs, + ): + super().__init__( + encoder, + llm, + encoder_projector, + tokenizer, + train_config, + model_config, + **kwargs, + ) + + + @torch.no_grad() + def inference( + self, + wav_path=None, + prompt=None, + generation_config=None, + logits_processor=None, + stopping_criteria=None, + prefix_allowed_tokens_fn=None, + synced_gpus=None, + assistant_model=None, + streamer=None, + negative_prompt_ids=None, + negative_prompt_attention_mask=None, + **kwargs, + ): + # inference for asr model + + device = kwargs.get("device", "cuda") + if os.path.exists(wav_path): # Audio-Text QA + import whisper + + audio_raw = whisper.load_audio(wav_path) + audio_raw = whisper.pad_or_trim(audio_raw) + + mel_size = getattr( + self.dataset_config, "mel_size", 80 + ) # 80 for large v1 and v2, 128 for large v3 + audio_mel = ( + whisper.log_mel_spectrogram(audio_raw, n_mels=mel_size) + .permute(1, 0)[None, :, :] + .to(device) + ) + + encoder_outs = self.encoder.extract_variable_length_features( + audio_mel.permute(0, 2, 1) + ) + + if self.model_config.encoder_projector == "q-former": + audio_mel_post_mask = torch.ones( + encoder_outs.size()[:-1], dtype=torch.long + ).to(encoder_outs.device) + encoder_outs = self.encoder_projector(encoder_outs, audio_mel_post_mask) + if self.model_config.encoder_projector == "linear": + encoder_outs = self.encoder_projector(encoder_outs) + else: # Text QA + encoder_outs = torch.empty( + 1, 0, self.llm.model.embed_tokens.embedding_dim + ).to(device) + + prompt = "USER: {}\n ASSISTANT:".format(prompt) + prompt_ids = self.tokenizer.encode(prompt) + prompt_length = len(prompt_ids) + prompt_ids = torch.tensor(prompt_ids, dtype=torch.int64).to(device) + + if hasattr(self.llm.model, "embed_tokens"): + inputs_embeds = self.llm.model.embed_tokens(prompt_ids) + elif hasattr(self.llm.model.model, "embed_tokens"): + inputs_embeds = self.llm.model.model.embed_tokens(prompt_ids) + else: + inputs_embeds = self.llm.model.model.model.embed_tokens(prompt_ids) + + inputs_embeds = torch.cat( + (encoder_outs, inputs_embeds[None, :, :]), dim=1 + ) # [audio,prompt] + + attention_mask = torch.ones(inputs_embeds.size()[:-1], dtype=torch.long).to( + inputs_embeds.device + ) + + # generate + model_outputs = self.generate( + inputs_embeds=inputs_embeds, attention_mask=attention_mask, **kwargs + ) + + return model_outputs diff --git a/examples/sec_emotioncaps/scripts/decode_emotion2vec_qformer_vicuna_7b.sh b/examples/sec_emotioncaps/scripts/decode_emotion2vec_qformer_vicuna_7b.sh new file mode 100644 index 00000000..05dbab7a --- /dev/null +++ b/examples/sec_emotioncaps/scripts/decode_emotion2vec_qformer_vicuna_7b.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# export PYTHONPATH=/root/whisper:$PYTHONPATH +# export PYTHONPATH=/root/fairseq:$PYTHONPATH +export CUDA_VISIBLE_DEVICES=1 +export TOKENIZERS_PARALLELISM=false +# export CUDA_LAUNCH_BLOCKING=1 +export OMP_NUM_THREADS=1 + +# debug setting for multiple gpus +# export NCCL_DEBUG=INFO +# export NCCL_DEBUG_SUBSYS=ALL +# export TORCH_DISTRIBUTED_DEBUG=INFO + +run_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/SLAM-LLM +cd $run_dir +code_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/SLAM-LLM/examples/sec_emotioncaps + +speech_encoder_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/ckpt/emotion2vec_base.pt +llm_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/ckpt/vicuna-7b-v1.5 +val_data_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/data/valid.jsonl + +encoder_fairseq_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/deps/emotion2vec/upstream + +output_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/out/sec-decode-$(date +"%Y%m%d-%s") + +ckpt_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/out/sec-finetune-20241001-1727786623/sec_epoch_1_step_3000/model.pt + +decode_log=$output_dir/decode_log + +hydra_args=" +hydra.run.dir=$output_dir \ +++model_config.llm_name=vicuna-7b-v1.5 \ +++model_config.llm_path=$llm_path \ +++model_config.llm_dim=4096 \ +++model_config.encoder_name=emotion2vec \ +++model_config.encoder_projector_ds_rate=5 \ +++model_config.encoder_path=$speech_encoder_path \ +++model_config.encoder_fairseq_dir=$encoder_fairseq_dir \ +++model_config.encoder_dim=768 \ +++model_config.encoder_projector=q-former \ +++dataset_config.dataset=speech_dataset \ +++dataset_config.val_data_path=$val_data_path \ +++dataset_config.data_path=$val_data_path \ +++dataset_config.inference_mode=true \ +++dataset_config.input_type=raw \ +++train_config.model_name=sec \ +++train_config.num_epochs=1 \ +++train_config.freeze_encoder=true \ +++train_config.freeze_llm=true \ +++train_config.batching_strategy=custom \ +++train_config.val_batch_size=4 \ +++train_config.num_workers_dataloader=2 \ +++train_config.output_dir=$output_dir \ +++log_config.log_file=$output_dir/train.log \ +++ckpt_path=$ckpt_path \ +++decode_log=$decode_log +" + +# -m debugpy --listen 5678 --wait-for-client +python $code_dir/inference_sec_batch.py \ + --config-path "conf" \ + --config-name "prompt.yaml" \ + $hydra_args \ No newline at end of file diff --git a/examples/sec_emotioncaps/scripts/finetune_emotion2vec_qformer_vicuna_7b.sh b/examples/sec_emotioncaps/scripts/finetune_emotion2vec_qformer_vicuna_7b.sh new file mode 100644 index 00000000..b7cf6b0d --- /dev/null +++ b/examples/sec_emotioncaps/scripts/finetune_emotion2vec_qformer_vicuna_7b.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# export PYTHONPATH=/root/whisper:$PYTHONPATH +# export PYTHONPATH=/root/fairseq:$PYTHONPATH +export CUDA_VISIBLE_DEVICES=0 +export TOKENIZERS_PARALLELISM=false +# export CUDA_LAUNCH_BLOCKING=1 +export OMP_NUM_THREADS=1 + +# debug setting for multiple gpus +# export NCCL_DEBUG=INFO +# export NCCL_DEBUG_SUBSYS=ALL +# export TORCH_DISTRIBUTED_DEBUG=INFO + +run_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/SLAM-LLM +cd $run_dir +code_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/SLAM-LLM/examples/sec_emotioncaps + +speech_encoder_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/ckpt/emotion2vec_base.pt +llm_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/ckpt/vicuna-7b-v1.5 +train_data_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/data/train.jsonl +val_data_path=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/data/valid.jsonl + +encoder_fairseq_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/deps/emotion2vec/upstream + +output_dir=/hpc_stor03/sjtu_home/ruiyang.xu/SLAM/out/sec-finetune-$(date +"%Y%m%d-%s") + +hydra_args=" +hydra.run.dir=$output_dir \ +++model_config.llm_name=vicuna-7b-v1.5 \ +++model_config.llm_path=$llm_path \ +++model_config.llm_dim=4096 \ +++model_config.encoder_name=emotion2vec \ +++model_config.encoder_projector_ds_rate=5 \ +++model_config.encoder_path=$speech_encoder_path \ +++model_config.encoder_fairseq_dir=$encoder_fairseq_dir \ +++model_config.encoder_dim=768 \ +++model_config.encoder_projector=q-former \ +++dataset_config.dataset=speech_dataset \ +++dataset_config.train_data_path=$train_data_path \ +++dataset_config.val_data_path=$val_data_path \ +++dataset_config.input_type=raw \ +++train_config.model_name=sec \ +++train_config.num_epochs=6 \ +++train_config.freeze_encoder=true \ +++train_config.freeze_llm=true \ +++train_config.batching_strategy=custom \ +++train_config.warmup_steps=1000 \ +++train_config.total_steps=100000 \ +++train_config.lr=1e-4 \ +++train_config.validation_interval=1000 \ +++train_config.batch_size_training=4 \ +++train_config.val_batch_size=4 \ +++train_config.num_workers_dataloader=2 \ +++train_config.output_dir=$output_dir \ +++metric=acc \ +++log_config.log_file=$output_dir/train.log \ +" + +# -m debugpy --listen 5678 --wait-for-client +if [[ $CUDA_VISIBLE_DEVICES != *","* ]]; then + python $code_dir/finetune_sec.py \ + --config-path "conf" \ + --config-name "prompt.yaml" \ + $hydra_args +else + torchrun \ + --nnodes 1 \ + --nproc_per_node 4 \ + --master_port=29503 \ + $code_dir/finetune_sec.py \ + --config-path "conf" \ + --config-name "prompt.yaml" \ + ++train_config.enable_fsdp=false \ + ++train_config.enable_ddp=true \ + ++train_config.use_fp16=true \ + $hydra_args +fi \ No newline at end of file diff --git a/examples/sec_emotioncaps/sec_config.py b/examples/sec_emotioncaps/sec_config.py new file mode 100644 index 00000000..70e55ab2 --- /dev/null +++ b/examples/sec_emotioncaps/sec_config.py @@ -0,0 +1,127 @@ +from dataclasses import dataclass, field +from typing import Optional, List +@dataclass +class ModelConfig: + file: str = "examples/sec_emotioncaps/model/slam_model_sec.py:model_factory" + llm_name: str = "vicuna-13b-v1.5" + llm_path: str = "path/to/vicuna" + llm_type: str = "decoder_only" + llm_dim: int = 4096 + encoder_name: Optional[str] = "emotion2vec" + encoder_ds_rate: int = 2 + encoder_path: Optional[str] = None + encoder_fairseq_dir: Optional[str] = None + encoder_dim: int = 768 + encoder_projector: str = "q-former" + encoder_projector_ds_rate: int = 5 + modal: str = "audio" + normalize: Optional[bool] = field(default=False, metadata={ + "help": "whether input is normalized, used for models such as wavlm" + }) + encoder_type: str = field(default="finetune", metadata={ + "help": "whether model is only pretrained or finetuned, used for models such as hubert" + }) + +@dataclass +class PeftConfig: + peft_method: str = "lora" # None, llama_adapter, prefix + r: int = 8 + lora_alpha: int = 32 + target_modules: List = field(default_factory=lambda: [ "q_proj", "v_proj" ]) + bias: str = "none" + task_type: str = "CAUSAL_LM" + lora_dropout: float = 0.05 + inference_mode: bool = False + +@dataclass +class TrainConfig: + model_name:str = "sec" + enable_ddp:bool = False + enable_deepspeed:bool = False + enable_fsdp:bool = False + low_cpu_fsdp:bool = False + run_validation:bool = True + batch_size_training:int = 4 + batching_strategy:str = field(default="packing", metadata={ + "help":"alternative: padding" + }) # + context_length:int = 4096 + gradient_accumulation_steps:int = 1 + num_epochs:int = 3 + num_workers_dataloader:int = 1 + warmup_steps:int = 1000 + total_steps:int = 100000 + validation_interval:int = 1000 + lr:float = 1e-4 + weight_decay:float = 0.0 + gamma:float = 0.85 + seed:int = 42 + use_fp16:bool = False + mixed_precision:bool = True + val_batch_size:int = 1 + + use_peft:bool = False + peft_config:PeftConfig = field(default_factory=PeftConfig) + output_dir:str = "PATH/to/save/PEFT/model" + freeze_layers:bool = False + num_freeze_layers:int = 1 + quantization:bool = False + one_gpu:bool = False + save_model:bool = True + dist_checkpoint_root_folder:str = "PATH/to/save/FSDP/model" # will be used if using FSDP + dist_checkpoint_folder:str = "fine-tuned" # will be used if using FSDP + save_optimizer:bool = False # will be used if using FSDP + use_fast_kernels:bool = False # Enable using SDPA from PyTroch Accelerated Transformers, make use Flash Attention and Xformer memory-efficient kernels + run_test_during_validation:bool = False + run_test_during_validation_file:str = "test.wav" + run_test_during_validation_prompt:str = "<|ASR|>" + freeze_llm:bool = field(default=False, metadata={ + "help": "whether to freeze llm when finetuning, should be true when use peft finetuning" + }) + freeze_encoder:bool = False + +@dataclass +class DataConfig: + dataset: str = "speech_dataset" + file: str = "src/slam_llm/datasets/speech_dataset.py:get_speech_dataset" + train_data_path: Optional[str] = None + val_data_path: Optional[str] = None + train_split: str = "train" + test_split:str = "validation" + prompt: Optional[str] = None + data_path: Optional[str] = None + max_words: Optional[int] = None + max_mel: Optional[float] = None + fix_length_audio: int = -1 + inference_mode: bool = False + input_type: str = field(default="raw", metadata={ + "help":"Use raw when input is wav, mel when for whisper" + }) + mel_size: int = field(default=80, metadata={ + "help": "80 for whisper large v1 and v2, 128 for v3" + }) + normalize: Optional[bool] = field(default=False, metadata={ + "help": "whether input is normalized, used for models such as wavlm" + }) + +@dataclass +class FSDPConfig: + mixed_precision: bool = True + use_fp16: bool = False + # sharding_strategy: str = "FULL_SHARD" #ShardingStrategy = ShardingStrategy.FULL_SHARD + sharding_strategy: str = "NO_SHARD" #MZY: set NO_SHARD when use DDP + checkpoint_type: str = "SHARDED_STATE_DICT" # alternatively can use SHARDED_STATE_DICT save one file per rank, and can resize the world-size. + fsdp_activation_checkpointing: bool = True + fsdp_cpu_offload: bool = False + pure_bf16: bool = False + optimizer: str = "AdamW" + +@dataclass +class LogConfig: + use_wandb: bool = False + wandb_dir: str = "/root/test_wandb" + wandb_entity_name: str = "project_name" + wandb_project_name: str = "project_name" + wandb_exp_name: str = "exp_name" + log_file: str = "/root/test.log" + log_interval: int = 5 diff --git a/src/slam_llm/models/encoder.py b/src/slam_llm/models/encoder.py index 76633404..f53b8262 100644 --- a/src/slam_llm/models/encoder.py +++ b/src/slam_llm/models/encoder.py @@ -175,3 +175,15 @@ def extract_features(self, source, padding_mask=None): _, hidden_states = self.model.get_predictions(source) out = hidden_states[self.config.encoder_layer_idx] return out + +class Emotion2vecEncoder: + + @classmethod + def load(cls, model_config): + import fairseq + model_path = UserDirModule(model_config.encoder_fairseq_dir) + fairseq.utils.import_user_module(model_path) + model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([model_config.encoder_path]) + model = model[0] + + return model \ No newline at end of file diff --git a/src/slam_llm/models/slam_model.py b/src/slam_llm/models/slam_model.py index fb7450e6..0aa93d34 100644 --- a/src/slam_llm/models/slam_model.py +++ b/src/slam_llm/models/slam_model.py @@ -98,6 +98,9 @@ def setup_encoder(train_config, model_config, **kwargs): if encoder_name == "musicfm": from slam_llm.models.encoder import MusicFMEncoder encoder = MusicFMEncoder.load(model_config) + if encoder_name == "emotion2vec": + from slam_llm.models.encoder import Emotion2vecEncoder + encoder = Emotion2vecEncoder.load(model_config) if "llama" in encoder_name.lower(): from slam_llm.models.encoder import HfTextEncoder @@ -343,6 +346,8 @@ def forward(self, audio_mel_post_mask = (~audio_mel_post_mask).float() if self.model_config.encoder_name == 'musicfm': encoder_outs = self.encoder.extract_features(audio, padding_mask = None) # MusicFM doesn't support padding mask + if self.model_config.encoder_name == "emotion2vec": + encoder_outs = self.encoder.extract_features(audio, None)['x'] # bs*seq*dim if self.encoder is None: encoder_outs = audio_mel if audio_mel is not None else audio From f37fe7395b6aef56f502d12d248a7a9150b06343 Mon Sep 17 00:00:00 2001 From: xrysamuel Date: Wed, 16 Oct 2024 20:59:33 +0800 Subject: [PATCH 2/3] Add README to examples/sec_emotioncaps --- examples/sec_emotioncaps/README.md | 56 +++++++++++++++++++++++- examples/sec_emotioncaps/docs/model.png | Bin 0 -> 114152 bytes 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 examples/sec_emotioncaps/docs/model.png diff --git a/examples/sec_emotioncaps/README.md b/examples/sec_emotioncaps/README.md index 3dbff491..4d6e0590 100644 --- a/examples/sec_emotioncaps/README.md +++ b/examples/sec_emotioncaps/README.md @@ -1 +1,55 @@ -# Speech Emotion Caption \ No newline at end of file +# Speech Emotion Caption + +## Model Architecture + +This recipe generates high-quality, human-like speech emotion descriptions. The model is based on the **q-former projector** and the **vicuna-7b-v1.5 LLM**. The model is trained on **an unpublished datasets** dataset, which is a large-scale dataset for speech emotion captioning. + +![](docs/model.png) + +## Performance and checkpoints + +We only train the q-former projector in this recipe. + +Encoder | Projector | LLM | Similarity Score +---|---|---|--- +[emotion2vec_base](https://huggingface.co/emotion2vec/emotion2vec_base) | [Q-Former](to_do)| [vicuna-7b-v1.5](https://huggingface.co/lmsys/vicuna-7b-v1.5) | 71.10 + +> **Note**: The baseline model [SECap](https://github.com/thuhcsi/SECap) was tested in our environment and achieved a similarity score of 71.52. Our model's score is slightly lower. + +## Data preparation +You need to prepare the data jsonl in this format. + +``` +{"key": "key_name", "source": "path_to_wav_file", "target": "corresponding_caption"} +... +``` + + +## Decode with checkpoints + +``` +bash decode_emotion2vec_qformer_vicuna_7b.sh +``` + +Modify the path including `speech_encoder_path`, `llm_path`, `output_dir`, `ckpt_path`, `val_data_path` and `decode_log` in the script when you run the shell script. + +## Train a new model + +If you do have sufficient relevant data, you can train the model yourself. + +``` +bash finetune_emotion2vec_qformer_vicuna_7b.sh +``` + +## Citation + +You can refer to the paper for more results. + +``` +@article{ma2024embarrassingly, + title={An Embarrassingly Simple Approach for LLM with Strong ASR Capacity}, + author={Ma, Ziyang and Yang, Guanrou and Yang, Yifan and Gao, Zhifu and Wang, Jiaming and Du, Zhihao and Yu, Fan and Chen, Qian and Zheng, Siqi and Zhang, Shiliang and others}, + journal={arXiv preprint arXiv:2402.08846}, + year={2024} +} +``` \ No newline at end of file diff --git a/examples/sec_emotioncaps/docs/model.png b/examples/sec_emotioncaps/docs/model.png new file mode 100644 index 0000000000000000000000000000000000000000..033e321fdbd8699233b63baff85f33bc07b14c46 GIT binary patch literal 114152 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 z z{DV-tjSQjJXN-ds(;v{3A#P%7H9YxXy4%6QA#|JKT5TLfX@b@)%Ki^#^8X~xqkNY{q?8Y4RxiobUq;M+X%%bk z=`eH!rYkQUlRkhon%#A*qW+OCn@3rf_k-HEUcI~1W>&p@+93+I!Y1|OMkQ~~k&Oi} z+NIt*BtO2C5@i)-L2CuzA8owf$dXwm^A}>rIWkAnp3_EWY25Y2^@#UbXWgde$@E*Q zzTZmzN2j%q<3@Rwb3aOfPHrv4$d(UisN zmyyZT`W9My#fHV-Ih5y}sw(Au|2aZlJU6nxQf{%3vYZeSSJtnyV;RO#%e8y|c%kVB z<+U?g+t$Awzfk}5OC4mn=C?Et>FkK>FfU>(aeR~Uvi1!PgRZIM#HMd+gU?8n+=1MZ z`dI}jD9soDqvoQw^e~y*DG$08AkhgSO1IwNo6N;J9kE^{O!ORy+Z-qPhd{1<6L82hS}GjeUM6Mi+LG`57_)o~P8Kn(Nh*=bClYCGPjBf_MV`Q`AWrp%|)f1R}| zbl+mnxNzax8o%)`2eP^foQpO>Mj`InKw4Y47jOeX3X_*FH71X0#Jaw|`{@5vw|N!GTEF%8_Zx1!n-J4y zA;q17@l~Z7zzk%B^VSmP6rejfxX(n%1h@5t6c;@Jph3AqXzhh|-(A^ylh-e;<^I|> z#@|MG_OnMi`s^?dP}q--QT=d9MDKo%;U;_U192Pvj}J>1r~->gnOZM`g@3&V;Q{C`!PdFi@kkEx#HwBL2s0e_Ca9=9ty>T~r!00sm(0RR91 literal 0 HcmV?d00001 From c16e3a95f582f47acbc332ce07c615f78d6f263d Mon Sep 17 00:00:00 2001 From: xrysamuel Date: Tue, 5 Nov 2024 14:28:27 +0800 Subject: [PATCH 3/3] fix model name, README and fsdp config for examples/sec_emotioncaps --- examples/sec_emotioncaps/README.md | 13 ------------- examples/sec_emotioncaps/model/slam_model_sec.py | 4 ++-- examples/sec_emotioncaps/sec_config.py | 7 +++++-- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/examples/sec_emotioncaps/README.md b/examples/sec_emotioncaps/README.md index 4d6e0590..d1aba1d2 100644 --- a/examples/sec_emotioncaps/README.md +++ b/examples/sec_emotioncaps/README.md @@ -40,16 +40,3 @@ If you do have sufficient relevant data, you can train the model yourself. ``` bash finetune_emotion2vec_qformer_vicuna_7b.sh ``` - -## Citation - -You can refer to the paper for more results. - -``` -@article{ma2024embarrassingly, - title={An Embarrassingly Simple Approach for LLM with Strong ASR Capacity}, - author={Ma, Ziyang and Yang, Guanrou and Yang, Yifan and Gao, Zhifu and Wang, Jiaming and Du, Zhihao and Yu, Fan and Chen, Qian and Zheng, Siqi and Zhang, Shiliang and others}, - journal={arXiv preprint arXiv:2402.08846}, - year={2024} -} -``` \ No newline at end of file diff --git a/examples/sec_emotioncaps/model/slam_model_sec.py b/examples/sec_emotioncaps/model/slam_model_sec.py index 0910d2ed..1edcdb3e 100644 --- a/examples/sec_emotioncaps/model/slam_model_sec.py +++ b/examples/sec_emotioncaps/model/slam_model_sec.py @@ -25,7 +25,7 @@ def model_factory(train_config, model_config, **kwargs): encoder_projector = setup_encoder_projector( train_config, model_config, **kwargs ) - model = slam_model_asr( + model = slam_model_sec( encoder, llm, encoder_projector, @@ -55,7 +55,7 @@ def model_factory(train_config, model_config, **kwargs): return model, tokenizer -class slam_model_asr(slam_model): +class slam_model_sec(slam_model): def __init__( self, encoder, diff --git a/examples/sec_emotioncaps/sec_config.py b/examples/sec_emotioncaps/sec_config.py index 70e55ab2..bc40b3d0 100644 --- a/examples/sec_emotioncaps/sec_config.py +++ b/examples/sec_emotioncaps/sec_config.py @@ -1,5 +1,8 @@ from dataclasses import dataclass, field from typing import Optional, List + +from torch.distributed.fsdp import ShardingStrategy + @dataclass class ModelConfig: file: str = "examples/sec_emotioncaps/model/slam_model_sec.py:model_factory" @@ -108,8 +111,8 @@ class DataConfig: class FSDPConfig: mixed_precision: bool = True use_fp16: bool = False - # sharding_strategy: str = "FULL_SHARD" #ShardingStrategy = ShardingStrategy.FULL_SHARD - sharding_strategy: str = "NO_SHARD" #MZY: set NO_SHARD when use DDP + # sharding_strategy = "FULL_SHARD" #ShardingStrategy = ShardingStrategy.FULL_SHARD + sharding_strategy: ShardingStrategy = "NO_SHARD" #ShardingStrategy.NO_SHARD #MZY: set NO_SHARD when use DDP checkpoint_type: str = "SHARDED_STATE_DICT" # alternatively can use SHARDED_STATE_DICT save one file per rank, and can resize the world-size. fsdp_activation_checkpointing: bool = True fsdp_cpu_offload: bool = False