DataWhale AI夏令营 Task2 精读代码实战进阶

1.磨刀不误砍柴功:学习利器之大语言模型

 1.1大语言模型初见:通义千问

                                                

        通义千问是由阿里云自主研发的大语言模型,用于理解和分析用户输入的自然语言,在不同领域和任务为用户提供服务和帮助。您可以通过提供尽可能清晰详细的指令,来获取符合预期的结果。

        通义千问凭借其强大的语言处理能力,为用户带来高效、智能的语言服务体验,其能力包括但不限于文字创作、翻译服务和对话模拟等,具体应用场景如下:

  • 文字创作:撰写故事、公文、邮件、剧本和诗歌等。

  • 文本处理:润色文本和提取文本摘要等。

  • 编程辅助:编写和优化代码等。

  • 翻译服务:提供各类语言的翻译服务,如英语、日语、法语或西班牙语等。

  • 对话模拟:扮演不同角色进行交互式对话。

  • 数据可视化:图表制作和数据呈现等。

        目前开源本文已经更新到2.5版本,下面,让我们一起来探索这个学习利器吧

 官网直达:通义tongyi.ai_你的全能AI助手

        点击进入后,可以在右上角注册或登录

还可以下载APP,在桌面或移动端快捷使用

        

        在页面中,我们可以点击新建对话,快速的开始使用通义千问,也可以创建智能体,让其知识更加集中于某一方面,所谓术业有专攻。

        下面,直接新建对话,帮助我们解读baseline代码

2.AI 解读代码:精读baseline-从零开始的AI生图之旅

         为了更加深入的理解baseline到底实现哪些功能,知其然还要知其所以然,我们使用大模型辅助学习

        下面,我会使用通义千问,对整个Baseline进行一个解读

2.1 首先是安装部分

!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.2 下载数据代码解释:

可以看到,AI语言大模型很正确的读出来,代码是从魔搭库下载数据集,并进行了延申,解释了每个参数的意义。

2.3 数据预处理

os.makedirs("./data/lora_dataset/train", exist_ok=True)
os.makedirs("./data/data-juicer/input", exist_ok=True)

        这两行代码使用os.makedirs创建了两个目录:./data/lora_dataset/train./data/data-juicer/inputexist_ok=True 参数确保如果目录已经存在,则不会抛出异常。

with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
    for data_id, data in enumerate(tqdm(ds)):
        image = data["image"].convert("RGB")
        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"]}
        f.write(json.dumps(metadata))
        f.write("\n")

 

这段代码遍历ds数据集中的每个样本,并对每个样本执行以下操作:

  • 将图像转换为RGB模式并保存到/mnt/workspace/kolors/data/lora_dataset/train/目录下。
  • 构建一个字典metadata,包含文本标签和图像路径。
  • 将每个样本的metadata写入到./data/data-juicer/input/metadata.jsonl文件中,每个样本一行。

 

data_juicer_config = """
# 全局参数
project_name: 'data-process'
dataset_path: './data/data-juicer/input/metadata.jsonl'  # 数据集目录或文件路径
np: 4  # 处理数据集的子进程数量

text_keys: 'text'
image_key: 'image'
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
    - image_aspect_ratio_filter:
        min_ratio: 0.5
        max_ratio: 2.0
        any_or_all: any
"""
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
    file.write(data_juicer_config.strip())

这段代码定义了一个YAML配置文件的内容,并将其写入data/data-juicer/data_juicer_config.yaml文件中。配置文件包含以下信息:

  • 项目名称、数据集路径、子进程数量。
  • 文本键、图像键、特殊图像标记。
  • 输出文件路径。
  • 图像尺寸过滤器和图像宽高比过滤器。
!dj-process --config data/data-juicer/data_juicer_config.yaml

 这一行使用dj-process命令运行数据清洗工具,传入前面创建的配置文件路径。这将会按照配置文件中的设置来清洗数据集,并将结果输出到./data/data-juicer/output/result.jsonl文件中。

总结一下,这段代码完成了以下几个主要任务:

  • 创建必要的目录结构。
  • 从数据集中提取图像,并将它们保存到指定目录下。
  • 构建包含图像路径和文本标签的元数据,并写入JSONL文件。
  • 定义数据清洗配置文件。
  • 使用data-juicer工具根据配置文件来处理数据集.

2.4保存数据

import pandas as pd
import os, json
from PIL import Image
from tqdm import tqdm


texts, file_names = [], []
os.makedirs("./data/data-juicer/output/images", exist_ok=True)
with open("./data/data-juicer/output/result.jsonl", "r") as f:
    for line in tqdm(f):
        metadata = json.loads(line)
        texts.append(metadata["text"])
        file_names.append(metadata["image"][0])

df = pd.DataFrame({"text": texts, "file_name": file_names})
df.to_csv("./data/data-juicer/output/result.csv", index=False)

 

2.5准备训练模型

df

from transformers import CLIPProcessor, CLIPModel
import torch

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

images = [Image.open(img_path) for img_path in df["file_name"]]
inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)

outputs = model(**inputs)
logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the probabilities

probs

 

此部分代码加载了CLIP模型和处理器,读取图像和准备输入数据,计算文本和图像的相似度,最终输出了概率分布。

from torch.utils.data import Dataset, DataLoader

class CustomDataset(Dataset):
    def __init__(self, df, processor):
        self.texts = df["text"].tolist()
        self.images = [Image.open(img_path) for img_path in df["file_name"]]
        self.processor = processor

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True)
        return inputs

dataset = CustomDataset(df, processor)
dataloader = DataLoader(dataset, batch_size=8)

for batch in dataloader:
    outputs = model(**batch)
    logits_per_image = outputs.logits_per_image
    probs = logits_per_image.softmax(dim=1)
    print(probs)

 

 2.6 训练模型

import torch
from diffusers import StableDiffusionPipeline

torch.manual_seed(1)
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
pipe = pipe.to("cuda")

prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒"
negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度"
guidance_scale = 4
num_inference_steps = 50

image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=guidance_scale,
    num_inference_steps=num_inference_steps,
    height=1024,
    width=1024,
).images[0]

image.save("example_image.png")
image

 

 详细解释了各种参数,方便接下来对其进行微调。

2.7生成图片

from PIL import Image

torch.manual_seed(1)
image = pipe(
    prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")

图片生成的原理相同,这里以第一幅图为例

 

至此baseline代码已经基本解读完毕,可以看出来,通义千问的性能是非常不错的,值得我们进一步的探究。

3.实战演练:利用大语言模型生成不同风格的图像

图片编号场景描述正向提示词反向提示词
图片1愚公正在移山坚韧不拔、毅力、决心软弱无力、放弃、无能为力
图片2山石被挖开成功、进步、努力有回报失败、停滞不前、没有进展
图片3子孙们加入移山队伍团结协作、传承、家庭力量分散孤立、自私自利、缺乏合作
图片4智叟嘲笑,愚公不理睬

坚韧、毅力、平和、坚定不移

动摇、犹豫、急躁、缺乏决心
图片5愚公坚持不懈坚韧不拔、毅力、决心

软弱无力、放弃、无能为力

图片6神仙帮助移山幸运、奇迹、天助我也不幸、灾难、无人援助
图片7山被移走,道路畅通完成目标、成功、喜悦失败、未完成、失望
图片8村民们庆祝胜利庆祝、欢乐、团结一心悲伤、沮丧、分裂

具体代码如下

结果如下

4.更多的选择:浅尝scepter webui

4.1网页体验

魔搭体验网址:https://www.modelscope.cn/studios/iic/scepter_studio 

4.2 官方定义

SCEPTER is an open-source code repository that focuses on generative training, fine-tuning, and inference. It includes a variety of downstream tasks such as image generation, transfer, and editing. The library integrates both popular community-driven implementations and proprietary methods developed by the Tongyi Lab at Alibaba Group. SCEPTER provides a comprehensive toolkit for researchers and practitioners working in the field of Artificial Intelligence Generated Content (AIGC), enabling them to innovate and accelerate development in the rapidly evolving area of generative models.

4.3核心组件

4.4私有部署(挑战型

魔搭社区提供的体验地址里面缺失了微调模型的功能,如果大家希望能使用secpter完整的功能,我们可以将其私有部署到我们自己的服务器。

github地址:https://github.com/modelscope/scepter

可以通过官方readme文件中的教程进行操作,该模块对基础有一定的要求,适合学有余力的同学

 

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值