基于天池Better Synth多模态大模型数据合成挑战赛的多模态大模型数据合成(2) [Datawhale AI 夏令营]


官方Baseline学习

再来回顾一下,该问题背景基于 天池Better Synth多模态大模型数据合成挑战赛,详细可以参考该链接。
简而言之,本背景基于图片数据方面,在合成与清洗图文数据中提高多模态大模型的图片理解能力。
基于 Mini-Gemini 模型进行训练,只关注于预训练(模态间对齐)阶段的数据合成与清洗,指令微调阶段为固定数据集。选用 MGM-2B 规模的模型作为模型。

小题外话

官方提供了相应的Baseline:
通过了基本的数据准备、下载,数据的环境配置后(下载需要等待一段时间)。

下面我们基于官方的Baseline,学习一下其中的内容:

数据合成

利用 Data-juicer(详见官方链接),我们可以快速调用blip模型合成数据:

dataset_path: input/pretrain_stage_1_10k/mgm_pretrain_stage_1_10k.jsonl
export_path: output/image_captioning_output/res_10k.jsonl

# np: 1
process:
  - image_captioning_mapper:
      hf_img2seq: '/root/autodl-tmp/better_synth_baseline_autoDL/models/goldsj/blip2-opt-2___7b'  # You can replace this path to a local downloaded HF model
      keep_original_sample: false  # we only need the recaptioned captions

其中,np设置>1支持并行处理,定义的常数取决于CPU和GPU的配置,process中的 image_captioning_mapper 就是 caption 的相关算子(官方定义)。

训练

我们只看官方可供修改的部分地方:

############################################################################
########################### Editable Part Begins ###########################
############################################################################
# exp meta information
EXP_NAME=default
PRETRAIN_DATASET=../input/pretrain_stage_1/mgm_pretrain_stage_1.jsonl
PRETRAIN_DATASET_IMAGE_PATH=../input/pretrain_stage_1

# training args
# pretraining
# make sure PRETRAIN_BATCH_SIZE_PER_GPU * PRETRAIN_GRADIENT_ACCUMULATION_STEPS * num_gpus = 256
# **NOTICE**: the default setting is for 8 GPU
PRETRAIN_BATCH_SIZE_PER_GPU=8
PRETRAIN_GRADIENT_ACCUMULATION_STEPS=4
PRETRAIN_DATALOADER_NUM_WORKERS=4
# finetuning
# make sure FINETUNE_BATCH_SIZE_PER_GPU * FINETUNE_GRADIENT_ACCUMULATION_STEPS * num_gpus = 128
# **NOTICE**: the default setting is for 8 GPU
FINETUNE_BATCH_SIZE_PER_GPU=8
FINETUNE_GRADIENT_ACCUMULATION_STEPS=2
FINETUNE_DATALOADER_NUM_WORKERS=4
# log and ckpt
LOGGING_STEP=1
CKPT_SAVE_STEPS=100
TOTAL_SAVE_CKPT_LIMIT=1

# inference args
# inference for some benchmarks supports multi-gpus
INFER_CUDA_IDX="0,1,2,3,4,5,6,7"
############################################################################
############################ Editable Part Ends ############################
############################################################################

其中,主要涉及显卡分配、PRETRAIN和FINETUNE的参数的相关配置,这里不再过多赘述。

小题外话(关于服务器中的python文件在导入自定义模块中识别不出mgm文件位置情况

在官方提供了相应的Baseline中的训练过程中,由于在Linux服务器中的python文件在导入自定义模块中容易出现识别不出mgm文件所在位置,非常容易红温(不是)。查阅资料后,笔者导入模块时使用相对路径导入后还是无效,最后找到如下解决办法:

在train_mem.py文件添加系统路径:

# 完整的绝对路径
import sys
sys.path.append("/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/")

from mgm.train.train import train

if __name__ == "__main__":
    train(attn_implementation="flash_attention_2")

同时,在两个数据集上推理的适合,也会出现类似错误:
同样,我们只要在此基础上添加类似指定即可:

export PYTHONPATH=“/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/:$PYTHONPATH”

以mmbench.sh为例:

#!/bin/bash
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)

CKPT=$1
SPLIT=$2

output_dir=$SCRIPT_DIR/../../output/eval_results/$CKPT/mmbench

# 在这里添加
export PYTHONPATH="/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/:$PYTHONPATH"

CUDA_VISIBLE_DEVICES=$3 python -m mgm.eval.model_vqa_mmbench \
    --model-path $SCRIPT_DIR/../../output/training_dirs/$CKPT \
    --question-file $SCRIPT_DIR/../training/data/eval_stage_1/mmbench/$SPLIT.tsv \
    --answers-file $output_dir/answers/$SPLIT/$CKPT.jsonl \
    --single-pred-prompt \
    --temperature 0 \
    --conv-mode gemma

mkdir -p $output_dir/answers_upload/$SPLIT

python $SCRIPT_DIR/../training/scripts/convert_mmbench_for_submission.py \
    --annotation-file $SCRIPT_DIR/../training/data/eval_stage_1/mmbench/$SPLIT.tsv \
    --result-dir $output_dir/answers/$SPLIT \
    --upload-dir $output_dir/answers_upload/$SPLIT \
    --experiment $CKPT

另一个文件就不再赘述。

最终,将结果按要求打包即可。

关于Data-juicer

官方提供了多种方便的算子(官方称呼),针对提供的数据集和合成数据,可以进一步利用对应算子进行数据筛选和清洗,提高数据质量,增强图文的一致性。

例如(这些操作会延长运行时间,对于算力不足的配置来说比较煎熬)以下:

image_text_matching_filter算子
image_text_similarity_filter算子
phrase_grounding_recall_filter算子、限制图片的长宽大小、描述文字的长短等(可查看官方,这里不再赘述)。

同时,也可以针对文本和图片分别进行处理和筛选。

参考资料

[1].天池Better Synth多模态大模型数据合成挑战赛.
[2]. Data-juicer.
[3].https://modelscope.github.io/data-juicer/_modules/data_juicer/ops/filter/image_text_matching_filter.html#ImageTextMatchingFilter.
[4].https://modelscope.github.io/data-juicer/_modules/data_juicer/ops/filter/image_text_similarity_filter.html.

您好!基于Qt框架实现中文语音合成的方法,可以使用科大讯飞提供的语音合成SDK。具体步骤如下: 1. 在科大讯飞官网注册账号,申请语音合成SDK的授权。 2. 在QT项目中添加SDK的头文件和库文件。 3. 调用SDK提供的接口,实现文字转语音的功能。 以下是一个简单的示例代码: ```c++ #include "qtts.h" #include "msp_cmn.h" #include "msp_errors.h" // 初始化语音合成 int InitTTS() { int ret = MSP_SUCCESS; const char* login_params = "appid = APPID, work_dir = ."; // 替换APPID为自己的应用ID ret = MSPLogin(nullptr, nullptr, login_params); if (MSP_SUCCESS != ret) { printf("MSPLogin failed, error code: %d.\n", ret); return ret; } // 设置语音合成参数 TTSConfig config = DEFAULT_TTS_CONFIG; config.vcn = "xiaoyan"; // 设置发音人为小燕 config.speed = 50; // 设置语速为50 config.volume = 50; // 设置音量为50 config.pitch = 50; // 设置音高为50 const char* session_begin_params = "voice_name = xiaoyan, text_encoding = UTF8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50"; // 创建语音合成句柄 QTTSInit(); return MSP_SUCCESS; } // 文字转语音 int TextToSpeech(const char* text, const char* filename) { int ret = MSP_SUCCESS; const char* session_begin_params = "voice_name = xiaoyan, text_encoding = UTF8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50"; const char* audio_format = "wav"; // 创建语音合成句柄 int synth_status = MSP_TTS_FLAG_STILL_HAVE_DATA; QTTSGetParam(nullptr, TTS_PARAM_SESSION_BEGIN, session_begin_params); const char* audio_data; unsigned int audio_len; FILE* fp = fopen(filename, "wb"); do { audio_data = QTTSSynthText(text, strlen(text), &audio_len, &synth_status, &ret); if (nullptr != audio_data) { fwrite(audio_data, audio_len, 1, fp); } } while (MSP_TTS_FLAG_STILL_HAVE_DATA == synth_status); fclose(fp); // 释放语音合成句柄 QTTSGetParam(nullptr, TTS_PARAM_SESSION_END, nullptr); return MSP_SUCCESS; } // 关闭语音合成 void CloseTTS() { QTTSFini(); MSPLogout(); } // 测试 int main(int argc, char** argv) { // 初始化语音合成 InitTTS(); // 文字转语音 TextToSpeech("科大讯飞,让世界聆听我们的声音。", "output.wav"); // 关闭语音合成 CloseTTS(); return 0; } ``` 需要替换代码中的APPID为自己的应用ID。同时,需要将SDK的头文件和库文件添加到QT项目中,并在项目中包含Qt5Core.dll、msc.dll等动态链接库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值