赞
踩
生成式模型在近年来广泛流行。在阅读本文时,读者很可能已经在与生成模型进行过互动。或许是使用ChatGPT生成文本,或许是在Instagram等应用中使用风格转换,亦或是看过那些引发热议的深度伪造视频。这些都是生成式模型的实际应用!
在系列文章中,我们将探索生成式模型的世界,从两大生成模型阵营——transformers和扩散模型(diffusion)的基础开始,逐步深入到更高级的话题。我们将介绍不同类型的生成模型,它们的原理,以及如何使用。我们还将探讨生成式模型的伦理和社会影响以及它们在现实世界中的应用。本文中,我们会回顾一下走到今天这一步的历程,并了解一些模型所提供的功能,这些功能我们在后续会进行更深入的探讨。
那么,什么是生成式模型呢?从顶层来讲,它的基本思想是向模型提供数据进行训练,以便未来能生成与训练数据相似的新数据。例如,如果我用一个包含猫咪图像的数据集来训练模型,那么我可以使用这个模型生成新的猫咪图像,这些图像看起来就像是出自原始数据集。这是一个强大的概念,具有广泛的应用范围,从创建新奇的图像和视频到生成具有特定风格的文本。
在本系列文章中,有许多流行的工具方便我们轻松使用现有的模型。在机器学习的世界中,可以找到能公开访问的在大型数据集上训练的模型,任何人都可以使用这些模型。训练这样的模型通常需要大量的资金和时间,因此能够公开访问这些模型是条捷径。这些预训练模型可以用来生成新数据、对现有数据分类等等。我们甚至可以修改这些模型使用到新的场景中。最知名的开源模型平台之一是Hugging Face,上面有数百万个用于各种机器学习任务的模型(包括图像生成)。
本文相关代码请见GitHub仓库。
我们先以开源库diffusers开始举例。diffusers是一个知名库,提供了对最炙手可热的扩散模型的访问。它是一个强大而简单的工具箱,让我们能够快速加载和训练扩散模型!
通过访问Hugging Face Hub并筛选基于文生图像(text-to-image)的模型,我们可以找到一些最流行的模型,如Stable Diffusion和SDXL。我们将使用Stable Diffusion 1.5版本,这是一种能够生成高质量图像的扩散模型!进入模型页面,可以阅读模型卡片页,这是对于观测性和可重复性至关重要的文档。在这里,我们可以了解关于模型的信息,包括它是如何训练的,预期的使用场景等等。
有了模型(Stable Diffusion)和使用模型的工具(diffusers),就可以生成我们的第一张图像了!在加载模型时,需要将它们发送到具体的硬件设备,如CPU(cpu)、GPU(cuda或cuda:0)或称为Metal的Mac硬件(mps)。以下代码将频繁出现:它会对变量赋值cuda:0
(如果有GPU可用);否则,则使用CPU。
- import torch
-
- device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
- print(f"Using device: {device}")
接下来,我们加载Stable Diffusion 1.5。diffusers 提供了名为StableDiffusionPipeline
的高阶封装,非常适合这种情况。不必担心烦杂的参数——重点如下:
runwayml/stable-diffusion-v1-5
。torch_dtype=float16
来设置较低的精度,使用比默认的float32
更少的内存。读者可能会希望了解
variant
参数。在某些代码库中,你可能会发现具有不同精度的多个检查点。当指定torch_dtype=float16
时,我们下载默认模型(float32
)并将其转换为float16
。通过指定fp16
变体,我们下载一个已经存储为float16
精度的小检查点,下载它只需要一半的带宽和存储空间。检查你要用代码储库,看看是否有多个精度变体!
初次运行此代码时可能会花费一些时间:管道需要下载好几个GB的模型!如若是第二次加载管道,仅在Hugging Face上托管模型的远程库发生变化时,才会重新下载模型。Hugging Face库将模型放在本地缓存中,这样后续加载速度更快。
- from diffusers import StableDiffusionPipeline
-
- pipe = StableDiffusionPipeline.from_pretrained(
- "runwayml/stable-diffusion-v1-5",
- torch_dtype=torch.float16,
- variant="fp16",
- ).to(device)
Loading pipeline components...: 0%| | 0/7 [00:00<?, ?it/s]
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["id2label"]` will be overriden.
此时模型已经加载好了,我们可以定义一个提示词(prompt),也即模型将接收的文本输入。然后将提示词传递给模型,根据该文本生成一张图像!
- prompt = "a photograph of an astronaut riding a horse"
- pipe(prompt).images[0]
-
- prompt = "a photograph of an astronaut riding a horse"
- pipe(prompt).images[0]
-
太神奇了!只需几行代码,我们就生成了一张新奇的图像。放松时间到,用不同的提示词生成新图像。可以注意到生成的图像会有不同程度的改进。在后续文章中,我们将探讨如何细颗粒度地控制生成过程,以及最新的具有更好生成能力的一些模型。
my dog
”这个概念,在场景中生成作者狗狗的图像,如“狗狗登上月球”。正如diffusers是一个非常便捷的扩散模型库,大名鼎鼎的transformers库在运行基于转换器的模型和适应新用例方面也极具价值。它为广泛的任务提供了标准化接口,例如生成文本、检测图像中的对象以及将音频文件转录为文本。
transformers库提供了不同层次的抽象。例如,如果不关心内部细节,最简单的方法是使用pipeline
,它抽象了获取预测所需的所有处理过程。我们可以通过调用pipeline()
函数并指定我们想要解决的任务(如文本分类text-classification
)来实例化一个管道。
- from transformers import pipeline
-
- classifier = pipeline("text-classification")
- classifier("This movie is disgustingly good !")
[{'label': 'POSITIVE', 'score': 0.9998536109924316}]
模型正确地预测了输入文本中的情感是正向的。默认,文本分类管道使用的是一个情感分析模型,但我们也可以指定其他基于transformers的文本分类模型。
同样,我们可以将任务切换为文本生成(text-generation
),通过它我们可以通过输入提示词生成新的文本。默认管道使用GPT-2模型。
- generator = pipeline("text-generation")
- prompt = "It was a dark and stormy"
- generator(prompt)[0]["generated_text"]
'It was a dark and stormy morning — dark clouds, mist, light and frost, and dark clouds with a thousand voices and with a thousand mouths and a thousand faces. The stars were the moon, the stars were the moon, and the stars'
虽然按照今天的标准,GPT-2算不上好模型,但它为我们提供了一个使用小模型初步了解transformers生成能力的机会。我们学习到的关于GPT-2的概念适用于诸如Llama或Mistral等一些(在撰写本文时)最强大的开源模型。在整个系列中,我们会平衡模型的质量和大小。通常,较大的模型会有更高质量的生成。同时,我们希望拥有消费级电脑或可以访问免费服务的人能够通过运行代码来做新的生成。
生成式模型不仅限于图像和文本,还可以生成视频、短歌、合成语音、蛋白质结构提案等!
第九章深入探讨可以通过机器学习解决的音频相关任务,例如转录会议内容和生成音效!当前,我们可以使用我们熟悉的transformers管道,并使用由Meta发布的MusicGen小版本模型,根据文本生成音乐。
注:本地运行MusicGen要求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。