Datawhale X 魔搭 AI夏令营 Task01 代码理解

Datawhale X 魔搭 AI夏令营 Task01 代码理解

概要

随着人工智能技术的飞速发展,文本到图像的生成(Text-to-Image Generation, T2I)技术取得了显著进展。快手近期开源的Kolors(可图)模型,以其卓越的中英文文本理解和高质量图像生成能力,受到了广泛关注。

整体架构流程

本实验旨在利用魔搭(ModelScope)工具链提供的强大支持,基于Kolors模型进行微调训练,以生成具有特定风格和连贯性的八图故事。

实验步骤

1,环境搭建

开通阿里云魔搭社区交互式建模PAI-DSW,获取免费算力支持。或者在魔搭社区进行授权,并选择魔塔平台免费实例。
然后新建终端,粘贴以下代码

git lfs install
git clone https://www.modelscope.c在这里插入代码片n/datasets/maochase/kolors.git

等待一分钟后,单击运行第一个代码块

[第一步:安装 ]
!pip install simple-aesthetics-predictor

!pip install -v -e data-juicer

!pip uninstall pytorch-lightning -y
!pip install peft lightning pandas torchvision

!pip install -e DiffSynth-Studio

等待以上安装包完成后,点击按钮以重启环境
重启

2,数据准备

下载Kolors模型及其权重文件(可通过GitHub或Huggingface等平台获取)。
准备或收集用于微调的数据集,包括不同风格的图像及其对应的文本描述。
依次执行下载数据集、数据处理

第二步:下载数据集
# 从modelscope库的msdatasets模块中导入MsDataset类  
from modelscope.msdatasets import MsDataset  
  
# 使用MsDataset类的load方法加载名为'AI-ModelScope/lowres_anime'的数据集  
# subset_name='default' 指定了数据集的子集名称,但在这个例子中,由于split已经明确指定为'train',  
# 所以这个参数可能是可选的,具体取决于MsDataset的实现  
# split='train' 指定了要加载的数据集分割为训练集  
# cache_dir="/mnt/workspace/kolors/data" 指定了数据集的缓存目录,用于存储下载的数据集  
ds = MsDataset.load(  
    'AI-ModelScope/lowres_anime',  # 数据集名称  
    subset_name='default',         # 数据集子集名称(可能是可选的)  
    split='train',                 # 数据集分割(训练集)  
    cache_dir="/mnt/workspace/kolors/data"  # 缓存目录  
)  
import json, os  
from data_juicer.utils.mm_utils import SpecialTokens  # 导入SpecialTokens
from tqdm import tqdm  # 导入tqdm库,用于显示进度条  
  
# 创建数据存储目录 
os.makedirs("./data/lora_dataset/train", exist_ok=True)  
os.makedirs("./data/data-juicer/input", exist_ok=True)  
  
# 打开一个文件用于写入JSON Lines格式的元数据  
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:  
    # 这里使用tqdm来显示处理进度  
    for data_id, data in enumerate(tqdm(ds)):  
        # 每个数据项包含一个名为'image'的PIL图像对象,将其转换为RGB模式  
        image = data["image"].convert("RGB")  
          
        # 保存转换后的图像到指定的训练数据集目录  
        # 图像文件将被保存为JPG格式,并且文件名是基于其索引的  
        image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")  
          
        # 构造元数据字典,其中包含一个文本标签("二次元")和图像文件的路径  
        metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}  
          
        # 将元数据字典转换为JSON字符串,并写入文件  
        # 每个元数据项后面都添加了一个换行符,以符合JSON Lines格式  
        f.write(json.dumps(metadata))  
        f.write("\n")  
  
## 第三步:数据处理 
data_juicer_config = """  
# 全局参数  
project_name: 'data-process'  # 项目名称  
dataset_path: './data/data-juicer/input/metadata.jsonl'  # 数据集文件的路径  
np: 4  # 用于处理数据集的子进程数量  
  
# 文本和图像的关键字配置  
text_keys: 'text'  # JSONL中包含文本数据的键  
image_key: 'image'  # JSONL中包含图像路径的键  
image_special_token: '<__dj__image>'  
  
# 处理结果的导出路径  
export_path: './data/data-juicer/output/result.jsonl'  
  
# 处理流程   
process:  
    - image_shape_filter:  # 图像形状过滤器  
        min_width: 1024  # 最小宽度  
        min_height: 1024  # 最小高度  
        any_or_all: any  # 'any'表示满足任一条件即可,'all'表示必须满足所有条件  
    - image_aspect_ratio_filter:  # 图像长宽比过滤器  
        min_ratio: 0.5  # 最小长宽比  
        max_ratio: 2.0  # 最大长宽比  
        any_or_all: any  # 同上,控制长宽比过滤器的逻辑  
"""  
  
# 将配置信息写入YAML文件  
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:  
    file.write(data_juicer_config.strip())  # 写入配置信息,并去除可能存在的首尾空白字符  
 
# !dj-process --config data/data-juicer/data_juicer_config.yaml  # 使用Data Juicer工具处理数据

在这里插入图片描述

3,训练模型

使用魔搭提供的工具链,加载Kolors模型并设置微调参数。
利用准备好的数据集进行模型训练。

# 导入os模块,用于执行系统命令  
import os  
  
# 定义一个多行字符串,其中包含要执行的命令行指令  
cmd = """  
# 使用python命令执行DiffSynth-Studio项目中的train_kolors_lora.py脚本  
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \  
  # 指定预训练的U-Net模型路径,该模型是扩散模型的一部分  
  --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \  
  # 指定预训练的文本编码器路径,用于将文本转换为模型可理解的向量  
  --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \  
  # 指定预训练的fp16 VAE(变分自编码器)模型路径,用于图像的压缩和解压  
  --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \  
  # 设置LoRA的秩(rank),这是一个重要的超参数,影响LoRA的容量和泛化能力  
  --lora_rank 16 \  
  # 设置LoRA的alpha值,这个值控制LoRA层对原始模型输出的影响程度  
  --lora_alpha 4.0 \  
  # 指定训练数据集的路径  
  --dataset_path data/lora_dataset_processed \  
  # 指定模型输出路径  
  --output_path ./models \  
  # 设置训练的最大轮次(epochs)  
  --max_epochs 1 \  
  # 使用中心裁剪作为数据预处理的一部分  
  --center_crop \  
  --use_gradient_checkpointing \  
  # 设置训练精度为混合精度16位,以加速训练并减少内存消耗  
  --precision "16-mixed"  
""".strip()  
os.system(cmd)

4,八图故事创作

编写自定义的故事大纲,包括八个关键情节或场景。
根据故事大纲,为每个场景编写详细的文本描述。
使用微调后的模型,根据文本描述生成对应的图像。

艾文的日常清晨:晨光透过窗帘缝隙,照在艾文沉睡的脸庞上。他缓缓睁开眼,迎接新的一天,眼中闪烁着对新开始的好奇与期待。
艾文在市集:艾文穿梭在熙熙攘攘的市集中,周围是五彩斑斓的摊位和琳琅满目的商品。他停下脚步,与一位商贩交谈,挑选着新鲜的水果和当地的特色手工艺品。
艾文与老友重逢:在市集的一角,艾文意外遇见了多年未见的老友杰克。两人紧紧握手,眼中满是重逢的喜悦。他们决定找一个安静的地方叙旧。
艾文与老友的计划:咖啡馆内,艾文和杰克面对面坐着,桌上摊开着一张泛黄的地图。杰克神秘地向艾文透露了一个关于古老宝藏的秘密,两人眼中闪烁着对冒险的渴望。
艾文准备出发:清晨,艾文站在家门口,背着装满必需品的行囊。他回头望了一眼熟悉的小镇,然后毅然决然地踏上了寻宝之旅。
艾文在丛林中:茂密的丛林中,艾文手持砍刀,小心翼翼地开路前行。汗水浸湿了他的衣衫,但他眼神坚定,不畏艰难。
艾文发现宝藏:经过漫长的探索,艾文终于来到了一个隐秘的山洞。在洞的最深处,他发现了那个传说中的宝藏——一箱闪闪发光的金币和宝石。他脸上露出了难以置信的笑容。
艾文与宝藏归来:艾文带着宝藏回到了小镇,成为了镇上的英雄。但他深知,这次旅程的真正收获是与老友的深厚情谊和面对困难时的勇气。他站在夕阳下,望着远方,心中充满了对未来的无限憧憬。

寻宝主题的

小结

在本次实验中,我亲身体验了LoRA技术的魅力,掌握了其在图像生成任务中的应用。我学会了如何将多个预训练模型集成到训练流程中,并通过调整LoRA的秩和alpha值来优化模型性能。同时,我也深入了解了数据预处理、模型评估以及计算资源优化的重要性。通过这次实验,我不仅加深了对深度学习技术的理解,还锻炼了问题解决和调试的能力。这些宝贵的经验和技能将对我未来的学习和研究产生积极的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值