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/input
。exist_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文件中的教程进行操作,该模块对基础有一定的要求,适合学有余力的同学