2024-10-14
深度学习
00

目录

定义数据集
容器启动
webui启动
训练启动
导出模型
部署

更详细的教程: https://www.dong-blog.fun/post/1661

定义数据集

写 zizhi.json 文件:

json
[ { "messages": [ { "content": "你是一个图像文字信息提取专家,可以识别图像中的文字,提取关键信息并输出为JSON格式。", "role": "system" }, { "content": "<image> 识别图像中的文字,提取关键信息并输出为JSON格式。\n\n## Goals\n1. 识别图像中的文字。\n2. 提取并输出图像中关键信息,以JSON格式返回。\n3. \"文字材料类别\"是必须输出的字段。\n4. 每种文字材料的图片需要提取的字段不一样。\n5. 多个材料返回多个字典,所有字典给入list里返回,形式类似:[dict,dict]。\n\n## Rules\n1. 需要识别图片是什么文字材料图片,并需要识别图像中的文字内容。\n2. 需要提取关键信息,并明确输出格式为JSON。\n3. 确保输出信息的准确性。\n\n## Workflows\n1. 分析图像中的文字内容。\n2. 识别并提取与用户需求相关的关键信息。\n3. 以JSON格式组织信息并输出。\n\n## 输出示范\n[{\"名称\": \"浙江告科科技有限公司\", \"有效期至\": \"2016年06月14日\", \"文字材料类别\": \"营业性演出许可证\"}]\n\n## 现在请你提取图片里的信息", "role": "user" }, { "content": "[{\"机构名称\": \"北京抠脚大汉科技有限公司\", \"有效期至\": \"2025年05月21日\", \"文字材料类别\": \"广播电视节目制作经营许可证\"}]", "role": "assistant" } ], "images": [ "/xiedong/yinzhang/save_dst/010155.jpg" ] } ]

dataset_info.json里这么加:

json
"zizhi": { "file_name": "zizhi.json", "formatting": "sharegpt", "columns": { "messages": "messages", "images": "images" }, "tags": { "role_tag": "role", "content_tag": "content", "user_tag": "user", "assistant_tag": "assistant", "system_tag": "system" } }

容器启动

把模型路径映射进去:

bash
cd LLaMA-Factory docker run -it --rm --gpus '"device=0,1,2,3"' \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ -v ./data:/app/data \ -v ./output:/app/output \ -v ./examples:/app/examples \ -v /ssd/xiedong/zizhishenhe/user_data_deal/data_new:/ssd/xiedong/zizhishenhe/user_data_deal/data_new \ -p 7861:7860 \ -p 8001:8000 \ --shm-size 16G \ kevinchina/deeplearning:llamafactory20241009 bash nerdctl run -it --rm --gpus '"device=0,1,2,3,4,5,6,7"' \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ -v ./data:/app/data \ -v ./output:/app/output \ -v ./examples:/app/examples \ -v ./20240802zizhi:/ssd/xiedong/zizhishenhe/20240802zizhi \ -p 7861:7860 \ -p 8001:8000 \ --shm-size 16G \ --name llamafactory4 \ kevinchina/deeplearning:llamafactory20241009 bash

webui启动

bash
llamafactory-cli webui

训练启动

vim examples/train_lora/qwen2vl_lora_sft_zizhi.yaml

yaml
### model model_name_or_path: /root/.cache/huggingface/Qwen2-VL-7B-Instruct # 模型的路径,指定你自己的模型路径。如果你有自定义模型,这里需要改成相应的路径。 ### method stage: sft # 指定训练阶段为 SFT(Supervised Fine-Tuning),这是一个监督微调的阶段。 do_train: true # 表示开始进行训练。 finetuning_type: lora # 使用 LoRA (Low-Rank Adaptation) 方法进行微调。建议避免使用 QLoRA 等其他复杂微调方法,因为 LoRA 效率更高且较为简单。 lora_target: all # 这里指定所有的模型层都将被 LoRA 处理,确保微调应用到整个模型。 deepspeed: examples/deepspeed/ds_z3_config.json # 这个是很猛的降低显存的办法,我加的!!!记住,这么加就行!!! lora_rank: 512 # 数据多就多给点 lora_alpha: 512 # 数据多就多给点 ### dataset dataset: zizhi # 使用的数据集。这里包含两个数据集:mllm_demo 和 identity。你可以使用这些默认数据集或者替换成自己的数据集。 template: qwen2_vl # 数据集的模板,用于定义如何处理输入和输出。 cutoff_len: 1024 # 输入文本的最大长度,超过这个长度的文本将被截断。 max_samples: 1000 # 最多处理的数据样本数量,这里限制为 1000 样本。 overwrite_cache: true # 是否覆盖预处理的数据缓存。如果之前缓存有数据,这里会强制覆盖。 preprocessing_num_workers: 16 # 数据预处理时使用的 CPU 核心数量,指定为 16 个核心以加速处理。 ### output output_dir: output/saves/qwen2_vl-7b/lora/sft_zizhi-2024-11-17-v1 # 训练输出的保存路径,所有训练结果将保存到这个目录。可以根据需要修改此路径。 logging_steps: 1 # 每隔 10 步进行一次日志记录,方便跟踪训练进度。 save_steps: 500 # 每 500 步保存一次模型检查点,确保可以在训练中途恢复。 plot_loss: true # 是否绘制损失曲线,开启此选项可以帮助你可视化训练损失的变化。 overwrite_output_dir: true # 是否覆盖之前的输出目录,如果之前有训练结果,这里会将其覆盖。 ### train per_device_train_batch_size: 2 # 每个设备(如 GPU)上的训练批次大小为 1,适合显存有限的设备。 gradient_accumulation_steps: 8 # 梯度累积步数为 8,这意味着每 8 个小批次的梯度将累积后再进行一次更新,等效于增加了有效批次大小。 learning_rate: 1.0e-4 # 学习率设置为 1.0e-4,这是一个较小的学习率,适合微调任务。 num_train_epochs: 50.0 # 训练的总轮数为 ,数据量多的话可以适当增加训练轮次。官方示例中默认使用 3 轮。 lr_scheduler_type: cosine # 使用余弦学习率调度器,学习率将根据余弦函数逐渐减少。 warmup_ratio: 0.1 # 热身比例为 0.1,这意味着前 10% 的训练步骤用于热身,逐渐增大学习率。 bf16: true # 使用 bf16 混合精度训练,能够在不损失太多精度的情况下加速训练。 ddp_timeout: 180000000 # DDP(分布式数据并行)超时设置,确保在分布式环境下不会因为超时导致训练中断。 ### eval val_size: 0.01 # 验证集占数据集的比例为 0.1,表示使用 10% 的数据集进行验证。 per_device_eval_batch_size: 1 # 每个设备上评估的批次大小为 1,与训练的批次大小一致。 eval_strategy: steps # 评估策略为按步评估,意味着每隔一定步数进行一次评估。 eval_steps: 500 # 每 500 步进行一次评估,确保训练期间可以监控模型性能。

执行LLaMA-Factory的指令在/app路径执行,免得遇到问题,直接执行就会开始训练:

bash
llamafactory-cli train examples/train_lora/qwen2vl_lora_sft_zizhi.yaml

显存占用:

image.png

训练损失曲线:

training_loss.png

导出模型

image.png

导出后16G模型:

image.png

在命令行导出,先创建yaml文件,vim examples/merge_lora/zizhi.yaml :

yaml
### model model_name_or_path: /root/.cache/huggingface/Qwen2-VL-7B-Instruct adapter_name_or_path: output/saves/qwen2_vl-7b/lora/sft_zizhi-2024-11-17-v1 template: qwen2_vl finetuning_type: lora ### export export_dir: output/saves/qwen2_vl-7b/lora/sft_zizhi-2024-11-17-v1-merge export_size: 5 export_device: cpu export_legacy_format: false

执行导出指令:

bash
llamafactory-cli export examples/merge_lora/zizhi.yaml

部署

开启服务:

bash
docker run --gpus device=3 -it --shm-size 16G \ --rm \ -v /ssd/xiedong/glm-4-9b-xd/LLaMA-Factory/output/saves/qwen2_vl-7b/lora/sft_zizhi-2024-11-17-v1-merge:/Qwen2-VL-Any \ -v /ssd/xiedong/zizhishenhe/x05_zizhi_review:/x05_zizhi_review \ -p 7866:7860 \ kevinchina/deeplearning:llamafactory20241009 bash cd /x05_zizhi_review python x999_app_zz_qwen2vl7b.py

后面做一个直接启动的:

bash
docker run --gpus all -d --shm-size 16G \ --rm -v /ssd/xiedong/glm-4-9b-xd/LLaMA-Factory/output/saves/qwen2_vl-7b:/Qwen2-VL-Any \ --net host \ -e MAX_PIXELS=602112 \ kevinchina/deeplearning:llamafactory20241009qwenapi | xargs -I {} docker logs -f {}
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!