|
目录创建环境安装依赖模型下载数据集微调开始训练模型合并推理可能遇到的错误创建环境condacreate-nqwen_vlpython==3.101安装依赖pipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple1使用清华源安装requirements.txt文件在官方github仓库。仓库链接:GitHub仓库中有三个re文件,微调我们只需要第一个就够了安装一下deepspeed,用于加速pipinstalldeepspeed-ihttps://pypi.tuna.tsinghua.edu.cn/simple1安装一下peft框架pipinstallpeft-ihttps://pypi.tuna.tsinghua.edu.cn/simple1模型下载第一种方法(推荐)去huggingface上下载,下载链接wen-VL-Chat第二种方法去魔塔下载,下载链接:Qwen-VL-Chat第二种方法用脚本下载importos#使用抱脸镜像os.environ["HF_ENDPOINT"]="https://hf-mirror.com"frommodelscopeimportsnapshot_downloadfromtransformersimportAutoModelForCausalLM,AutoTokenizer#其中版本v1.1.0支持INT4、INT8的在线量化,其余版本不支持model_id='qwen/Qwen-VL-Chat'revision='v1.0.0'#下载模型到指定目录local_dir="/root/autodl-tmp/Qwen-VL-Chat"snapshot_download(repo_id=model_id,revision=revision,local_dir=local_dir)1234567891011121314151617数据集数据集格式如下:[{"id":"identity_0","conversations":[{"from":"user","value":"你好"},{"from":"assistant","value":"我是Qwen-VL,一个支持视觉输入的大模型。"}]},{"id":"identity_1","conversations":[{"from":"user","value":"Picture1:https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg\n图中的狗是什么品种?"},{"from":"assistant","value":"图中是一只拉布拉多犬。"},{"from":"user","value":"框出图中的格子衬衫"},{"from":"assistant","value":"格子衬衫(588,499),(725,789)"}]},{"id":"identity_2","conversations":[{"from":"user","value":"Picture1:assets/mm_tutorial/Chongqing.jpeg\nPicture2:assets/mm_tutorial/Beijing.jpeg\n图中都是哪"},{"from":"assistant","value":"第一张图片是重庆的城市天际线,第二张图片是北京的天际线。"}]}]1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950微调qwenVL提供了finetune.py脚本来进行微调,这个脚本也在github仓库里,自行下载即可。单卡微调#单卡训练shfinetune/finetune_lora_single_gpu.sh12finetune_lora_single_gpu.sh脚本在github仓库的finetun文件下。其中的内容为:#!/bin/bashexportCUDA_DEVICE_MAX_CONNECTIONS=1DIR=`pwd`exportNCCL_P2P_DISABLE="1"exportNCCL_IB_DISABLE="1"MODEL="/qwen-vl/Qwen-VL-Chat/"#"Qwen/Qwen-VL-Chat"/"Qwen/Qwen-VL"#Setthepathifyoudonotwanttoloadfromhuggingfacedirectly#ATTENTION:specifythepathtoyourtrainingdata,whichshouldbeajsonfileconsistingofalistofconversations.#SeethesectionforfinetuninginREADMEformoreinformation.DATA="/qwen-vl/new1_qwen.json"exportCUDA_VISIBLE_DEVICES=1pythonfinetune.py\--model_name_or_path$MODEL\--data_path$DATA\--bf16True\--fix_vitTrue\--output_diroutput_qwen\--num_train_epochs25\--per_device_train_batch_size2\--per_device_eval_batch_size1\--gradient_accumulation_steps8\--evaluation_strategy"no"\--save_strategy"steps"\--save_steps1000\--save_total_limit10\--learning_rate1e-3\--weight_decay1e-3\--adam_beta20.95\--warmup_ratio0.01\--lr_scheduler_type"cosine"\--logging_steps1\--report_to"none"\--model_max_length1024\--lazy_preprocessTrue\--gradient_checkpointing\--use_lora12345678910111213141516171819202122232425262728293031323334353637这两行是为了解决RTX4090显卡通信问题exportNCCL_P2P_DISABLE=“1”exportNCCL_IB_DISABLE=“1”MODEL和DATA改为自己的模型地址和数据集地址我这里修改脚本里的model_max_length参数,默认是2048(需要27.3GB的显存),调小开始训练输入命令:nohup./finetune_lora_single_gpu.sh>train.log2>&1&1nohup:nohup是“nohangup”的缩写,它用于在用户退出登录后继续运行命令。使用nohup可以防止进程在用户退出会话后被挂起。./finetune_lora_single_gpu.sh:这是要运行的脚本文件,位于当前目录下。这个脚本文件名为finetune_lora_single_gpu.sh,通常用于单GPU上进行LoRA(Low-RankAdaptation)的微调。">"重定向符号,将命令的标准输出(stdout)重定向到文件。train.log:重定向输出的目标文件名。这里是train.log,用于保存命令的标准输出。2>&1:这部分将标准错误输出(stderr)重定向到标准输出(stdout)。2代表标准错误,1代表标准输出,>&表示重定向。通过这个重定向,标准错误输出和标准输出都会被写入train.log文件。&:将命令放到后台运行。这意味着命令会在后台执行,用户可以继续在当前终端进行其他操作。显示如下:可得知这个为train进程,且被挂到后台。用命令etail-ftrain.log来实时监控train.log,以查看训练情况模型训练完会保存在output_qwen文件中,想要修改去finetune.py脚本中修改--output_dir参数。模型合并合并脚本frompeftimportAutoPeftModelForCausalLMmodel=AutoPeftModelForCausalLM.from_pretrained(path_to_adapter,#将这里改为输出新模型的路径device_map="auto",trust_remote_code=True).eval()merged_model=model.merge_and_unload()#max_shard_sizeandsafeserializationarenotnecessary.#Theyrespectivelyworkforshardingcheckpointandsavethemodeltosafetensorsmerged_model.save_pretrained(new_model_directory,max_shard_size="2048MB",safe_serialization=True)12345678910111213new_model_directory为合并后的新模型的存放位置推理fromtransformersimportAutoTokenizer,AutoModelForCausalLMimporttorchfromtransformersimportAutoModelForCausalLM,AutoTokenizerfromtransformers.generationimportGenerationConfigimporttorchtorch.manual_seed(1234)#加载合并后的模型和tokenizertokenizer=AutoTokenizer.from_pretrained("/qwen-vl/new_model/",trust_remote_code=True)#默认gpu进行推理,需要约24GB显存model=AutoModelForCausalLM.from_pretrained("/qwen-vl/new_model/",device_map="cuda",trust_remote_code=True).eval()#可指定不同的生成长度、top_p等相关超参(transformers4.32.0及以上无需执行此操作)#model.generation_config=GenerationConfig.from_pretrained("Qwen/Qwen-VL",trust_remote_code=True)query=tokenizer.from_list_format([{'image':'/qwen-vl/dewarping_test1.png'},#Eitheralocalpathoranurl{'text':'ProvidetheOCRresultsofthispicture.'},])inputs=tokenizer(query,return_tensors='pt')inputs=inputs.to(model.device)pred=model.generate(**inputs)response=tokenizer.decode(pred.cpu()[0],skip_special_tokens=False)print(response)image=tokenizer.draw_bbox_on_latest_picture(response)ifimage:image.save('2.jpg')else:print("nobox")1234567891011121314151617181920212223242526272829可能遇到的错误显存不足,调小batchsize或model_max_length找不到分词器,报错信息:ValueError:UnrecognizedconfigurationclasstobuildanAutoTokenizer.相关问题解决可以看我这篇博客:链接:UnrecognizedconfigurationclasstobuildanAutoTokenizer.因为保存模型的时候没有保存token相关的文件,解决方法是将最初模型的分词器文件粘贴过来到新模型中,应该就三个文件如下:最后在推理的时候,在获取tokenizer的时候,一定要加上trust_remote_code=True,如下:tokenizer=AutoTokenizer.from_pretrained(“/root/autodl-tmp/self_qwen/”,trust_remote_code=True)
|
|