当前位置:   article > 正文

通义千问(Qwen-VL)本地微调_qwen-vl 微调

qwen-vl 微调

进入官网使用模型代码:https://github.com/QwenLM/Qwen-VL/blob/master/README_CN.md

git clone https://github.com/QwenLM/Qwen-VL.git
安装依赖环境:
  1. pip3 install -r requirements.txt
  2. pip3 install -r requirements_openai_api.txt
  3. pip3 install -r requirements_web_demo.txt
  4. pip3 install deepspeed
  5. pip3 install peft
  6. pip3 install optimum
  7. pip3 install auto-gptq
下载模型文件:

在这里可以选择多种下载方式,然后根据自己的显存选择合适的,我是选择最小的Int4的量化模型,但是我参照使用git命令行下载会下载不了不知为何,最后还是自己手动下载到本地

魔搭社区地址魔搭社区

git clone https://www.modelscope.cn/qwen/Qwen-VL-Chat-Int4.git

建议下载完使用ls -ll看看大小是否正确。

数据准备:

官方上给的对话是一次对话给一个框的信息,但是如果一张图有多个框就需要多次对话。经过测试发现对话轮数越多训练时间也越长,并且测试后发现貌似一个id好像仅限6轮对话(不确定),所以需要根据自己的数据进行修改。测试后发现数据格式可以询问一张图片然后回复有多个框的信息,即类似于:

最后即一个id一张图片然后进行一轮对话。要多轮也可以,到时候可以进行修改。

下面是数据集转化的代码,从xml转换为Qwen的格式:

  1. import json
  2. import os
  3. import xml.etree.ElementTree as ET
  4. # 初始化JSON数据结构
  5. all_data=[]
  6. # 指定XML文件所在的目录
  7. xml_directory = '/qwentest/gongfutrain'
  8. i=0
  9. # 遍历目录下的所有XML文件
  10. for filename in os.listdir(xml_directory):
  11. if filename.endswith('.xml'):
  12. # 构建完整的文件路径
  13. file_path = os.path.join(xml_directory, filename)
  14. i=i+1
  15. # 解析XML文件
  16. tree = ET.parse(file_path)
  17. root = tree.getroot()
  18. file_name = root.find('filename').text
  19. json_data = {
  20. "id": f"identity_{i-1}",
  21. "conversations": []
  22. }
  23. conversation1 = {
  24. "from": "user",
  25. "value": f"Picture {i}: <img>/qwentest/gongfutrain/{file_name}</img>\n描述下图片的主要对象以及他们的位置信息"
  26. }
  27. json_data['conversations'].append(conversation1)
  28. conversation = {
  29. "from": "assistant",
  30. "value": ""
  31. }
  32. for obj_elem in root.findall('object'):
  33. # 提取必要的数据
  34. object_name = obj_elem.find('name').text
  35. bbox = obj_elem.find('bndbox')
  36. if bbox is not None: # 确保bndbox元素存在
  37. xmin = int(bbox.find('xmin').text)
  38. ymin = int(bbox.find('ymin').text)
  39. xmax = int(bbox.find('xmax').text)
  40. ymax = int(bbox.find('ymax').text)
  41. else:
  42. # 处理bndbox不存在的情况
  43. print(f"Warning: No bounding box found in {filename}")
  44. continue
  45. a=f'<ref>{object_name}</ref><box>({xmin},{ymin}),({xmax},{ymax})</box>'
  46. # 创建单个conversation对象并添加到JSON数组中
  47. if conversation["value"] == "":
  48. conversation["value"] = a
  49. else:
  50. conversation["value"] += " " + a
  51. json_data['conversations'].append(conversation)
  52. all_data.append(json_data)
  53. # 将JSON对象转换为字符串并保存到文件中
  54. with open('gongfu.json', 'w', encoding='utf-8') as f:
  55. json.dump(all_data, f, ensure_ascii=False, indent=2)
  56. print("转换完成,所有XML文件的数据已整合到json文件中。")
微调:

因为资源有限,使用QLora形式。修改finetune/finetune_qlora_single_gpu.sh中的一些设置,其中主要修改标红部分,其他参数自己设当调整。

运行代码开始微调。

sh finetune/finetune_qlora_single_gpu.sh

Q-lora不支持合并,可以按照以下方法使用,默认保存路径是output_qwen。如果用的lora可以看官方文档如何合并。

  1. from peft import AutoPeftModelForCausalLM
  2. model = AutoPeftModelForCausalLM.from_pretrained(
  3. path_to_adapter, # path to the output directory
  4. device_map="auto",
  5. trust_remote_code=True
  6. ).eval()

训练完成后可以使用官方的测试demo进行测试,主要修改一下模型的加载路径即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/343074
推荐阅读
相关标签
  

闽ICP备14008679号